Tidaklah aman untuk menguraikan ls
atau mengirim pipa find
[ 1 , 2 ]
Tidaklah aman untuk mem-parsing (dan mem-pipe) output ls
atau 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 find
perintah yang tidak disalurkan dengan opsi -exec
akan berfungsi:
find ./*.png -exec basename {} .png \;
Pembaruan / Catatan : Anda dapat menggunakan find .
bahkan untuk mencari file yang tersembunyi, atau find ./*.png
hanya untuk mendapatkan file yang tidak tersembunyi. Dengan find *.png -exec ...
Anda dapat memiliki masalah dalam hal itu ada file bernama .png
karena find akan mendapatkannya sebagai opsi. Anda dapat menambahkan -maxdepth 0
untuk 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 man
panorama 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 *png
akan 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 ls
atau find
perintah 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 printf
atau echo
akan 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.png
pada akhirnya, tidak ada alasan mengapa saya tidak dapat memiliki file png bernamafoo.zip
ataumy.picture.20160518
atau hanyamypic
.