Bagaimana cara mengosongkan ("memotong") file di linux yang sudah ada dan dilindungi bagaimanapun juga?

113

Saya memiliki file bernama error.log di server saya yang harus sering saya potong. Saya memiliki izin rw untuk file tersebut. Membuka file di vi> menghapus semua konten> menyimpan karya (jelas). Tapi saat saya coba di bawah ini

cat /dev/null > error.log

Saya mengerti pesannya

File already exists.

Jelas ada beberapa jenis konfigurasi yang dilakukan di server untuk mencegah penimpaan file yang tidak disengaja. Adakah yang bisa tahu bagaimana cara "memotong" file dalam satu perintah?

Sumeet Pareek
sumber
2
Untuk file yang tidak dilindungi, potong -s 0 file berfungsi.
Pramod

Jawaban:

158

Anda memiliki noclobberset opsi. Kesalahannya sepertinya berasal dari csh, jadi Anda akan melakukan:

cat /dev/null >! file

Jika saya salah dan Anda menggunakan bash, Anda harus melakukan:

cat /dev/null >| file

di bash, Anda juga dapat mempersingkatnya menjadi:

>| file
R Samuel Klatchko
sumber
Anda benar tentang shell yang menjadi csh. Bagaimana kamu tahu itu?
Sumeet Pareek
6
@Wikidkaka - berdasarkan pesan kesalahan. csh di sistem saya memberikan File existskesalahan yang sama sedangkan bash memberikan cannot overwrite existing filekesalahan yang sangat berbeda .
R Samuel Klatchko
6
@Jarmund - karena pengguna memiliki set noclobber, >filetidak bekerja.
R Samuel Klatchko
Apa perbedaan antara > filedan >| file?
Akankah
1
@Will - jika Anda memiliki noclobberpilihan yang ditetapkan, mencoba untuk mengarahkan ke file yang ada gagal. Untuk menimpa pengalihan spesifik sementara membiarkan noclobber menyala, Anda dapat menggunakan>|
R Samuel Klatchko
71

Anda juga dapat menggunakan fungsi truncate

$truncate -s0 yourfile

jika izin ditolak, gunakan sudo

$sudo truncate -s0 yourfile

Bantuan / Manual: man truncate

diuji di ubuntu Linux

risnandar
sumber
1
truncate juga menyentuh waktu modifikasi file - sementara "> file" tidak menyentuh jika file tidak diubah.
dsteinkopf
Itu tidak melepaskan ruang disk yang disimpan file. Pada awalnya ini menunjukkan 0 byte. Tetapi ketika Anda menulis sesuatu ke file itu, ukuran file adalah = sebelum pemotongan + ukuran data baru.
Aniket Kulkarni
48

Ini akan cukup untuk mengatur ukuran file menjadi 0:

> error.log
SIFE
sumber
6
sebenarnya, ini tidak bekerja dengan noclobber (mengujinya sendiri), jadi BUKAN solusi yang valid dalam kasus ini ("-bash: error.log: tidak dapat menimpa file yang ada"); lihat pujian di atas ("@Jarmund - karena pengguna memiliki set noclobber,> file tidak berfungsi."). Saya hanya ingin tahu seperti apa
9

Penghargaan diberikan kepada rekan senior saya untuk ini:

:> filename

Ini tidak akan merusak file log, jadi Anda bahkan dapat menggunakannya di syslog, misalnya.

petermolnar.dll
sumber
8
Tolong jelaskan. Bagaimana cara kerjanya? Apa yang dilakukan notasi itu?
user31986
2
@ user31986 :adalah perintah tanpa efek (hampir menjadi komentar), kemudian >dialihkan seperti biasa, sehingga ini hanya mengalihkan kekurangan keluaran dari perintah yang tidak melakukan apa pun ke dalam file. Jika noclobber diaktifkan, Anda perlu :>| filename(bash) (dan saya menganggap :>! filenamedi csh dengan asumsi csh memiliki :).
Rhubbarb
4

false | tee fileToTruncate

mungkin berhasil juga

Dodger Web
sumber
Itu konyol. Atau jika ini berguna, secara tidak jelas menghasilkan ddkeluaran tidak ada yang lebih baik daripada yang biasa dibaca false?
tripleee
2

Karena sudo tidak akan berfungsi dengan pengalihan > , saya suka teeperintah untuk tujuan ini

echo "" | sudo tee fileName
sakhunzai
sumber
baik, sebenarnya begitu, seperti yang dijelaskan dalam pertanyaan yang Anda tautkan dan di sini di atas. "sudo sh -c '> error.log'" ...
itu tergantung pada hak akses pada file target error.log, jika itu sudah bisa ditulis tidak perlu sudo. Saya pikir masalah lainnya adalah Anda memberikan perintah sebagai argumen string ke sh, saya tidak tahu bagaimana itu ditangani secara internal tetapi itu adalah lapisan kompleksitas / pengalihan lain yang ditambahkan
sakhunzai
1
Ini tidak akan benar-benar memotong file, karena echo ""akan menambah baris baru. Anda dapat menggunakan echo -n ""untuk menekan baris baru
Seb
0

Siapapun dapat mencoba perintah ini untuk memotong file apapun di sistem linux

Ini pasti akan berfungsi dalam format apa pun:

truncate -s 0 file.txt
pengguna3301460
sumber
0

Saya suka ini: cp /dev/null file

Den129
sumber
-4

Anda juga dapat mencoba:

echo -n > /my/file

Oden
sumber
8
Lihat jawabannya dengan banyak suara? Cobalah membacanya, dan lihat ke atas noclobberlalu tanyakan pada diri Anda apakah jawaban Anda masuk akal sama sekali.