Bagaimana cara menghapus konten file dari baris perintah?

280

Saya memiliki file log yang memiliki banyak hal di dalamnya yang tidak saya perlukan lagi. Saya ingin menghapus isinya.

Saya tahu cara mencetak konten ke layar:

cat file.log

Saya tahu cara mengedit file, baris demi baris:

nano file.log

Tetapi saya tidak ingin menghapus setiap baris satu per satu. Apakah ada cara untuk melakukannya dalam satu perintah tanpa merusak file untuk melakukannya?

Andrew
sumber

Jawaban:

466

Dalam bash, adil

> filename

akan melakukan.

Ini akan meninggalkan Anda dengan nama file file kosong .

ps

Jika Anda perlu sudomenelepon, harap pertimbangkan untuk menggunakan truncatesebagaimana dijawab di sini .

kutu buku
sumber
57
Ini mungkin perintah raddest dalam sejarah komputasi
blarg
7
Sebaliknya, @ Arekkusandaa.Irujasukin; ini berfungsi dengan baik di semua versi Windows, selama, seperti yang disebutkan, Anda menggunakan bashsebagai shell Anda dan bukan eg cmd.exeatau PowerShell, yang keduanya tidak cukup POSIXy diharapkan untuk menangani hal-hal seperti itu.
DopeGhoti
124

Anda dapat menggunakan perintah pengguna: truncate

truncate -s 0 test.txt

("-s 0" untuk menentukan ukuran)

http://www.commandlinefu.com/commands/view/12/empty-a-file

tidak tidak
sumber
3
Jawaban terbaik sekitar, berfungsi saat Anda non-root (dengan sudo) - sudo echo > filehanya memberikan kesalahan dalam kasus seperti itu.
Dmitry Verkhoturov
12
@DmitryVerkhoturov: sudo bash -c '> filename'adalah bagaimana Anda menggunakan solusi Bash dengan sudo.
Stuart P. Bentley
1
brew install truncatepada os x dengan homebrew diinstal.
xaxxon
Bekerja lebih cepat daripada gema
Miao1007
34

Anda bisa melakukan ini:

echo -n "" > file.log

Menggunakan >untuk menulis input (null) dari echo -nke file.

Menggunakan >>akan menambahkan input nol ke file (secara efektif tidak melakukan apa pun kecuali touchitu).

Temanku
sumber
Ini akan meninggalkan ruang di sana.
dmckee
Saya mendapatkan ini: -bash:: perintah tidak ditemukan
Andrew
3
echo ""> masih akan memberi Anda file dengan satu karakter (baris baru.) Jika Anda ingin menggunakan echo, gunakan "echo -n> file.log" untuk echo null.
Dave Forgac
Akan lebih baik menggunakan perintah null-output khusus seperti true(atau alias bawaannya :), meskipun pada akhirnya Anda tidak memerlukan perintah sama sekali (lihat jawaban yang diterima).
Stuart P. Bentley
Anda mungkin memiliki beberapa masalah dengan sudo.
flapjack
27
: > file.log

Sama seperti > filenamedi Bash, tetapi bekerja di lebih banyak kerang (kredit) . Redirect output dari truebuiltin (yang tidak memiliki output) ke filename.

Stuart P. Bentley
sumber
Saya datang untuk membuat jawaban ini, tetapi sayangnya sudah ada di sini ... Terima kasih.
Aaron Hall
5
Lakukan saja :> filename. Bukankah itu terlihat seperti tersenyum? :>
minmaxavg
10

ZSH

>! filename

ZSH akan melindungi pengguna dari clobbering file menggunakan operator pengalihan io >. Jika Anda menggunakan, >!Anda dapat memaksa pemotongan file yang ada.

Jika Anda ingin ZSH menggunakan perilaku pengalihan Bash, jika tidak ada perlindungan dari clobbering file, maka Anda perlu mengatur clobberopsi untuk shell Anda.

Info Lebih Lanjut: http://zsh.sourceforge.net/Doc/Release/Redirection.html

Brian Wigginton
sumber
8

JIKA Anda ingin melakukan dari dalam editor vim di baris perintah, Anda dapat mencoba ini:

vim file.txt 

Tekan Esc.

:1,$d

Tekan Enter.

Anda akan menemukan semua baris dihapus.

soum
sumber
Ini adalah satu-satunya hal yang bekerja untuk saya maillog, bahkan sudo > /var/log/maillogtidak akan menghapusnya (izin ditolak)
bobobobo
2
@obobobo Ini tidak berfungsi sebagai sudo > /var/log/maillogalat - jalankan sudo, dan masukkan hasilnya ke file. Jelas itu menempatkan output dengan izin pengguna saat ini. Hal yang lebih mudah dilakukan sudo suuntuk memulai shell root dan kemudian lakukan > /var/log/maillog.
kan
4
$ rm file.log; touch file.log

atau

$ cat > file.log

diikuti oleh control-d.

atau ... atau ... atau ...

Ah. Ini adalah versi perintah tunggal:

$ dd if=/dev/null of=file.log
dmckee
sumber
2
Saran Thechickenmoo echo "" > file.loglebih baik daripada catopsi yang Anda tunjukkan, dalam situasi ini, ada yang lain catyang lebih tepat. keduanya menggunakan pengalihan shell yang sama untuk melakukan pengangkatan berat.
quack quixote
2
Anda tidak perlu menjalankan perintah cat. Hanya "> file.log" akan melakukannya.
camh
Menghapus file akan mengatur ulang tanggal pembuatan.
Matteo
Menghapus file akan menyebabkan program menonton file tersebut kehilangan pointer ke sana (yaitu, itu akan memiliki alamat baru di sistem file). Secara umum, ya rmakan menyelesaikan tugas menghasilkan file kosong dengan nama yang sama. Tapi itu tidak akan tepat untuk setiap kasus penggunaan.
robert
4

Perintah di bawah ini juga harus berfungsi:

cat /dev/null > file.log
paarth batra
sumber
2

Jika Anda perlu sudo ke hak akses superuser untuk mengakses file maka jawaban yang diterima tidak akan berfungsi. Menggunakan ini berfungsi:

truncate -s0 file

atau secara eksplisit dengan sudo:

sudo truncate -s0 file

Info lebih lanjut di sini http://www.commandlinefu.com/commands/view/12/empty-a-file

tukang waktu
sumber
1

Beberapa alternatif:

ex +%d -scwq file.log
cp /dev/null file.log
vi +%d -escwq file.log
install -m600 /dev/null file.log
kenorb
sumber
1

Jika Anda memiliki spasi dalam nama file, gunakan:

for file in /path/to/file/*; do > "$file"; done

(Saya tidak dapat memasukkannya ke dalam komentar untuk jawaban sebelumnya karena saya tidak memiliki reputasi 50. Terkadang keterbatasan bersifat kontra-produktif.)

d491049
sumber
0

Satu baris sekaligus?

Coba vi (m), editor teks cantik yang bisa melakukan apa saja. Dalam hal ini, navigasikan ke sebuah saluran, tekan d (untuk menghapus), dan d lagi (untuk saluran).

Phoshi
sumber
5
Jika Anda ingin menyingkirkan seluruh file dalam vim, dengan kursor di bagian atas dokumen, ketikkan d G (itu d, maka shift-G) akan menghapus seluruh file (d untuk menghapus, G untuk akhir dari mengajukan). Saya lebih suka metode Anda, meskipun (memberi saya lebih banyak waktu untuk berpikir apakah saya BENAR-BENAR ingin membuang file).
Babu
@Babu ggbergerak ke atas sehingga seluruh urutan bisa terjadi ggdG.
Bob
0

Dengan izin saya ini adalah satu-satunya hal yang berhasil:

touch temp.txt
sudo mv temp.txt original-file.txt
Morgan
sumber
0

Juga, jika Anda memiliki banyak file, Anda dapat menggunakan yang berikut ini:

for file in /path/to/file/*; do > $file; done

Ini bermanfaat untuk file log di direktori yang sama.

DomainsFeatured
sumber
0

> a.txt

Sama seperti> nama file di Bash, tetapi berfungsi di lebih banyak shell (kredit). Redirect output dari builtin yang sebenarnya (yang tidak memiliki output) ke nama file.

pengguna1021769
sumber