Tidaklah aman untuk menguraikan lsatau mengirim pipa find[ 1 , 2 ]
Tidaklah aman untuk mem-parsing (dan mem-pipe) output lsatau find, terutama karena mungkin untuk menemukan dalam nama file karakter yang tidak biasa sebagai baris baru , tab ... Di sini siklus shell murni akan bekerja [ cuonglm ] .
Bahkan findperintah yang tidak disalurkan dengan opsi -execakan berfungsi:
find ./*.png -exec basename {} .png \;
Pembaruan / Catatan : Anda dapat menggunakan find .bahkan untuk mencari file yang tersembunyi, atau find ./*.pnghanya untuk mendapatkan file yang tidak tersembunyi. Dengan find *.png -exec ...Anda dapat memiliki masalah dalam hal itu ada file bernama .pngkarena find akan mendapatkannya sebagai opsi. Anda dapat menambahkan -maxdepth 0untuk menghindari turun di direktori bernama Dir_01.png, atau find ./*.png -prune -exec ...ketika maxdepth tidak diizinkan (terima kasih Stéphane). Jika Anda ingin menghindari daftar direktori tersebut, Anda harus menambahkan opsi -type f(yang juga akan mengecualikan jenis file non-reguler lainnya). Coba lihat untuk manpanorama yang lebih lengkap tentang semua opsi yang tersedia, dan ingatlah untuk memeriksa kapan mereka sesuai dengan POSIX, untuk portabilitas yang lebih baik.
Beberapa kata lagi
Bisa terjadi, misalnya, bahwa menyalin judul dari dokumen dan menempelkan ke nama file, satu atau lebih baris baru akan selesai dalam nama file itu sendiri. Kita bisa sangat sial sehingga judul bisa mengandung bahkan kunci yang harus kita gunakan sebelum baris baru:
The new art of working on .png
files and other formats.
Jika Anda ingin menguji, Anda dapat membuat nama file seperti ini dengan perintah
touch "A file with two lines"$'\n'"and This is the second.png"
touch "The new art of working on .png"$'\n'"files and other formats.png"
Sederhana /bin/ls *pngakan menampilkan ?bukan karakter yang tidak dapat dicetak
A file with two lines?and This is the second.png
The new art of working on .png?files and other formats.png
Dalam semua kasus di mana Anda akan pipa output dari lsatau findperintah berikut tidak akan memiliki petunjuk untuk memahami jika garis ini berasal dari baru nama berkas atau jika ia mengikuti baris baru karakter dalam preseden nama berkas . Sebuah jahat nama memang, tapi masih satu hukum.
Siklus shell dengan shell Parameter-Expansion,, ${parameter%word}dalam varian dengan printfatau echoakan bekerja [ cuonglm ], [ Anthon1 ] .
for f in *.png; do printf "%s\n" "${f%.png}" ; done
Dari halaman manual Ekspansi Parameter Shell [ 3 ]
$ {parameter% word}
$ {parameter %% kata}
... hasil ekspansi adalah nilai parameter dengan pola pencocokan terpendek (case '%') atau pola pencocokan terpanjang (case '%%') dihapus.
.di dalamnya. Meskipun konvensi mengatakan untuk memberi nama file Anda.pngpada akhirnya, tidak ada alasan mengapa saya tidak dapat memiliki file png bernamafoo.zipataumy.picture.20160518atau hanyamypic.