Katakanlah saya memiliki direktori dengan banyak file, semuanya adalah file biner (file tanpa ekstensi yang dideklarasikan) dan file sumber (.c
perpanjangan). Saya melakukan ini:
$ ls
dan dapatkan:
README.md hello-world.c hello-world get-name.c get-name
dan saya hanya ingin membuat daftar file dengan ekstensi tertentu (katakan keduanya .c
dan .md
), saya lakukan:
ls *.c *.md
dan tidak apa-apa!
Tapi bagaimana jika sekarang saya ingin menghapus semua file yang tidak memiliki .c
atau .md
ekstensi, bagaimana saya bisa melakukan ini?
Saya tahu cara melakukannya pada file yang ekstensinya saya ketahui, seperti:
ls *.c *.md | xargs rm
Tetapi bagaimana cara memberi tahu baris perintah untuk menghapus file yang JANGAN cocok dengan kriteria saya?
Jawaban yang Diterima:
Gunakan find
:
find -maxdepth 1 ! -name "*.c" -print0 | xargs -0 ...
Perhatikan bahwa -maxdepth
, -print0
, -r
dan -0
ditemukan di beberapa find
implementasi (diperkenalkan oleh GNU find
/xargs
) tetapi tidak ditentukan oleh POSIX. Cara lain adalah, seperti yang disebutkan Stéphane dalam komentarnya, menggunakan -exec
aksi menemukan – ingatlah untuk menggunakan perintah -exec command {} +
form, karena secara dramatis mengurangi jumlah pemanggilan command
(itu harus mengizinkan sintaks di mana nama file ditempatkan di akhir, atau Anda harus membungkus command
di dalam sh -c
telepon).
Atau grep
keluaran ls
ls | grep -v ".c$" | xargs ...
Anda dapat memfilter beberapa ekstensi baik dengan ekspresi reguler:
... | grep -v ".(c|md)$" | ...
dengan regexp yang diperluas:
... | grep -Ev ".(c|md)$" | ...
dengan opsi string tetap (tidak akan cocok hanya di akhir nama file!):
... | grep -vF ".c
.md" | ...
atau dengan merangkai lebih banyak grep
s:
... | grep -v ".c$" | grep -v ".md$" | ...
Yang mengatakan, find
mungkin merupakan opsi terbaik, karena dengan -print0
opsi itu menangani semua karakter yang mungkin dalam nama file yang mungkin perlu melarikan diri jika tidak (asalkan find
Anda dan xargs
dapat bekerja dengan string yang diakhiri NULL – mis. alat GNU adalah).