Hapus file dengan kisaran ukuran tertentu

12

Saya ingin menghapus file yang ukurannya antara nilai-nilai tertentu. Misalnya saya punya daftar file berikut:

-rw-r--r-- 1 smsc sys  558 Apr 30 13:07 stats.sfe.1.20120430130513.xml.Z
-rw-r--r-- 1 smsc sys  388 Apr 30 15:32 stats.sfe.1.20120430153013.xml.Z
-rw-r--r-- 1 smsc sys  386 Apr 30 15:36 stats.sfe.1.20120430153513.xml.Z
-rw-r--r-- 1 smsc sys  389 Apr 30 15:42 stats.sfe.1.20120430154013.xml.Z
-rw-r--r-- 1 smsc sys  390 Apr 30 16:02 stats.sfe.1.20120430160013.xml.Z
-rw-r--r-- 1 smsc sys  385 Apr 30 16:12 stats.sfe.1.20120430161013.xml.Z

Dari daftar di atas, saya hanya ingin menghapus file yang ukurannya bervariasi antara 386b dan 390b . Saya tahu bahwa saya dapat menggunakan perintah berikut untuk menghapus file dengan ukuran melebihi tertentu <size>:

find . -size +<size>-delete

Tetapi bagaimana saya bisa menambahkan satu batas lagi untuk file yang ukurannya kurang dari nilai yang diberikan?

Eugene S
sumber
4
findkondisi secara logis DANDi secara default, jadi tempelkan -sizeopsi lain untuk terikat lainnya.
jw013
@ jw013 Hebat! Itu bekerja untuk saya. Terima kasih! Silakan posting sebagai jawaban Anda dan saya akan menerimanya.
Eugene S

Jawaban:

7

Kisaran hanyalah batas atas DAN batas bawah. Dari findspec :

ekspresi [-a] ekspresi

Konjungsi primer; operator AND tersirat oleh penjajaran dua pendahuluan atau dibuat eksplisit oleh operator -a opsional. Ekspresi kedua tidak akan dievaluasi jika ekspresi pertama salah.

Jadi yang perlu Anda lakukan adalah menentukan batas ukuran kedua sebelum -deletetindakan.

jw013
sumber
8

Di operator -aeksplisit ANDyang memungkinkan Anda untuk menggabungkan dua pemilihan pendahuluan. Dalam hal ini membuat rentang menggunakan -size.

find . -size +386b -a -size -390b -exec rm -f {} \;

Perhatikan bahwa ukurannya adalah argumen numerik yang secara opsional dapat ditambahkan dengan +dan -. Dari man 1 find:

   Numeric arguments can be specified as

   +n     for greater than n,
   -n     for less than n,
    n      for exactly n.
George M.
sumber
Terima kasih atas jawaban Anda. Namun, seperti @ jw013 disebutkan dalam komentarnya, findkondisinya secara logis DAN akan secara default. Jadi saya hanya menambahkan satu sizesyarat lagi dan itu bekerja dengan baik! Perintah terakhir terlihat seperti:find . -maxdepth 1 -size +358c -size -395c -delete
Eugene S
7

Kapan pun findmengharapkan suatu angka, Anda bisa meletakkan +tanda di depannya yang berarti lebih dari angka ini, atau -tanda yang berarti kurang dari angka ini. Ini adalah ketidaksetaraan yang ketat: +3dan -7berarti 4, 5 atau 6.

Dengan -sizeprimer, Anda perlu menambahkan akhiran cuntuk menunjukkan bahwa nomor tersebut adalah jumlah byte. Anda dapat menggabungkan beberapa primer untuk mengambil konjungsi (dalam beberapa versi, Anda dapat menempatkan -aatau di -andantara mereka). Jadi:

find . -size +385c -size -391c -delete

Di zsh, Anda dapat menggunakan L kualifikasi glob . Unit default adalah byte; suka find, karakter +dan -menunjukkan ketidaksetaraan yang ketat.

rm *(L+385-391)

(Perintah di atas tidak berulang ke dalam subdirektori; jika Anda membutuhkannya, tambahkan **/sebelum pola.)

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Saya tidak mengerti +3 dan -7 sama dengan 4, 5 atau 6. Bisakah Anda jelaskan?
Hashim
1

Salah satu cara menggunakan perl:

perl -e '
    for ( @ARGV ) { 
        if ( -s >= 386 && -s _ <= 390 ) { 
            unlink $_ or printf qq[%s\n], qq[Could not delete $_: $!] 
        } 
    }
' *
Birei
sumber
Terima kasih atas jawaban Anda! Haruskah bagian kode ini dimasukkan sebagai satu baris?
Eugene S
@EugeneS: Ya. Ini harus berfungsi menempelkannya di baris perintah Anda apa adanya atau menggabungkan semua baris menjadi satu.
Birei