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?

pengguna245115
sumber

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

sumber
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
AB
sumber
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.

terdon
sumber
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
Maythux
sumber
Di Ubuntu 14.04 LTS, tanpa -type f, -emptyjuga akan menghapus direktori kosong. Baru saja memeriksa halaman manual.
Bulrush