Misalkan saya memiliki folder yang berisi .txt , .pdf , dan file lainnya. Saya ingin mendaftar file "lainnya" (yaitu, file tidak memiliki ekstensi .txt atau .pdf ). Apakah Anda punya saran tentang cara melakukan ini?
Saya tahu cara membuat daftar file yang tidak memiliki ekstensi yang diberikan. Misalnya, jika saya ingin mendaftar semua file kecuali file .txt , maka baik
find -not -iname "*.txt"
atau
ls | grep -v '\.txt$' | column
sepertinya berhasil. Tapi, bagaimana saya bisa mendaftar semuanya kecuali file .txt atau .pdf ? Tampaknya saya perlu menggunakan semacam logika "atau" di find
atau grep
.
ls
vsfind
vs globbing mungkin berbeda untuk dotfiles tersembunyi.find
akan melintasi subdirektori, seperti rekursifls
. Gunakan-maxdepth 1
denganfind
untuk membuatnya berperilaku lebih sepertils
.Jawaban:
Dengan asumsi seseorang memiliki versi yang sesuai
ls
, ini mungkin cara paling sederhana:Jika Anda ingin beralih di semua subdirektori:
sumber
ls
Opsi GNU tidak portabel.ls
lagipula tidak benar-benar termasuk dalam skrip portabel, jadi saya berasumsi OP bertanya tentang penggunaan interaktif saja.Temukan dukungan
-o
Anda perlu tanda kurung untuk membuat hak diutamakan. Temukan melakukan banyak hal; Saya sarankan membaca halaman manualnya.
Anda juga dapat melakukan atau dalam
grep
(tapi sungguh, Anda tidak harus melewatkan output darils
)sumber
ls
?find
manual, saya dengan sepenuh hati merekomendasikan artikel tentang Unix Power Toolsfind
, seperti docstore.mik.ua/orelly/unix3/upt/ch09_06.htm dan docstore.mik.ua/orelly/unix3/upt/ch09_12.htmfind . NOT ( *.txt OR *.pdf )
Dengan
bash
globbing yang diperluas (aktifkan denganshopt -s extglob
), glob!(*.txt|*.pdf)
akan bekerja. Anda bisa mengirimkan glob ini langsung ke perintah apa pun yang mengambil argumen file, termasuk tetapi tidak terbatas padals
.sumber
-d
untuk menghindari itu:ls -d !(*.txt|*.pdf)
Dalam
zsh
denganextendedglob
:atau
Atau dengan
kshglob
(ya, itu ksh globbing bukan "bash extended globbing"):Ingat juga bahwa mereka juga mengecualikan file dot.
ksh93 memiliki fitur
FIGNORE
(mis):sumber
Ini setara dengan perintah dengan operator OR, karena hukum De Morgan .
sumber
Seperti yang disarankan oleh derobert, taruhan terbaik Anda adalah menggunakan
find
. Namun, Anda dapat sebenarnya menggunakan hasilnya dalam pipa dengan perintah lain.GNU (dan beberapa BSD)
find
mendukung-print0
predikat yang memerintahkannya untuk mencetak nama file yang diakhiri oleh karakter NUL , karakter mana yang tidak diperbolehkan dalam nama file dan menjamin tidak akan ada tabrakan. Perintah lain dapat diinstruksikan untuk menggunakan NUL sebagai pembatas input mereka.Yang paling penting adalah GNU
xargs
, yang menjalankan perintah yang Anda tentukan dan meneruskannya daftar file sebagai argumen baris perintah. Anda ingin menjalankanxargs -r0
bersama dengan find's-print0
Misalnya:Ini dengan aman mencetak daftar direktori panjang semua file pdf dan txt , termasuk yang memiliki spasi atau karakter yang tidak dapat dicetak dalam namanya.
Anda juga dapat menggunakannya dengan GNU
tar
sebagai berikut:Ini membangun file tar.gz dari semua file yang namanya tidak diakhiri dengan .tar.gz
rsync
juga menerima file dengan batas nol dengan-0
parameter, seperti yang dilakukan beberapa orang lainnya. Tetapixargs
lem yang biasanya Anda gunakan untuk tujuan semacam ini. Entah itu ataufind
's-exec
fitur.sumber
tar
perintah adalah yang baik. Namun, untuk sebagian besar tujuan,-exec
lebih cocok.Jika Anda tidak memiliki subdirektori
juga harus bekerja!
Tapi
adalah cara yang umum.
sumber
Sebagai pelengkap, jika Anda menggunakan shell yang kompatibel dengan bash, Anda dapat menggunakan variabel GLOBIGNORE untuk mengecualikan resuts dari pencocokan pola. Dari pria itu:
Dalam kasus khusus Anda:
Harap dicatat saya menjalankan perintah itu sebagai sub-shell (menggunakan tanda kurung) agar tidak mengubah variabel lingkungan GLOBIGNORE dari shell interaktif saya.
sumber