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?


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.


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.

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.)


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 $_: $!] 
        } 
    }
' *

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