Hapus file berukuran 0 byte melalui baris perintah?


16

Jadi, saya mendapat direktori yang berisi direktori lain, dan saya bertanya-tanya apakah mungkin untuk menghapus file yang tidak memiliki ukuran. Biasanya file-file ini adalah 0 byte dan karena saya ingin menggabungkan semua subdirs ini saya bisa mengganti file yang benar-benar sah dengan file 0 byte yang tidak berbobot, dan itu berarti file legit saya. Adakah cara untuk menghapus file byte nol?

Jawaban:


34

Gunakan perintah Find untuk menemukan file berdasarkan ukuran dan mencetak nama file ke output standar.

find . -type f -size 0b -print

gantikan -printdengan -deleteuntuk menghapus file daripada mencetaknya di layar.

find . -type f -size 0b -delete

Sekarang, apakah ada cara untuk memindahkan file dari satu lokasi ke lokasi lain, dan dengan konflik ganti jika ukurannya sama tetapi simpan kedua salinan jika ukurannya berbeda?
— user245115

Ini terdengar seperti pekerjaan untuk rsync .

7
Anda bisa menggunakan -emptybukan -size 0b.
— Kevin

6

Temukan dan hapus semua file dengan ukuran 0 secara rekursif:

find . -type f -size 0 -print0 | xargs -I{} -0 rm {}

Contoh:

% ls -og   
total 4
-rw-rw-r-- 1 0 Jun  7 20:31 bar
-rw-rw-r-- 1 5 Jun  7 20:29 foo

% find . -size 0 -print0 | xargs -I{} -0 rm {}

% ls -og                                      
total 4
-rw-rw-r-- 1 5 Jun  7 20:29 foo

4

Anda juga dapat melakukannya langsung di shell. Ini bisa bermanfaat jika Anda tidak ingin menghapus file tersembunyi yang kosong (file yang namanya dimulai dengan a .). Meskipun Anda juga bisa melakukannya find, alternatifnya adalah menggunakan shell itu sendiri:

shopt -s globstar
for file in **/*; do [ ! -s "$file" ] && [ -f "$file" ] && rm "$file"; done

Penjelasan

  • shopt -s globstar: mengaktifkan opsi globstar untuk bash yang membuat **kecocokan satu atau lebih subdirektori. **/*akan cocok dengan semua file dan direktori di direktori saat ini dan semua subdirektori.
  • for file in **/*; do ...; done : beralih ke semua file dan direktori yang ditemukan;
  • [ ! -s "$file" ]: [ -s "$file" ]benar jika file ada dan tidak kosong. Oleh karena itu, [ ! -s "$file" ]( !invers tes) adalah benar jika file tidak ada atau jika kosong.
  • [ -f "$file" ]: true jika file tersebut adalah file biasa. Bukan direktori atau file perangkat atau symlink dll.
  • rm "$file" : hapus file.

The &&memastikan bahwa perintah berikutnya hanya dijalankan jika yang sebelumnya berhasil jadi ini hanya akan menghapus kosong, file biasa.


dan saya pikir, jawaban saya rumit :) +1
— AB

2

Meskipun sebagian besar jawaban di atas benar, lihatlah perintah ini:

File berukuran 0 byte berarti file kosong

meskipun Anda dapat menjalankan perintah ini:

find . -type f -empty -delete

ini akan menghapus semua file kosong.

Anda dapat melihat file-file itu sebelum menghapus:

find . -type f -empty

Di Ubuntu 14.04 LTS, tanpa -type f, -emptyjuga akan menghapus direktori kosong. Baru saja memeriksa halaman manual.
— Bulrush
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.