Saya mencoba untuk menemukan semua file dengan ekstensi spesifik dalam direktori dan subdirektori dengan bash saya (Rilis LTS Ubuntu Terbaru).
Inilah yang ditulis dalam file skrip:
#!/bin/bash
directory="/home/flip/Desktop"
suffix="in"
browsefolders ()
for i in "$1"/*;
do
echo "dir :$directory"
echo "filename: $i"
# echo ${i#*.}
extension=`echo "$i" | cut -d'.' -f2`
echo "Erweiterung $extension"
if [ -f "$i" ]; then
if [ $extension == $suffix ]; then
echo "$i ends with $in"
else
echo "$i does NOT end with $in"
fi
elif [ -d "$i" ]; then
browsefolders "$i"
fi
done
}
browsefolders "$directory"
Sayangnya, ketika saya memulai skrip ini di terminal, ia mengatakan:
[: 29: in: unexpected operator
(dengan $extension
alih - alih 'in'
)
Apa yang terjadi di sini, di mana kesalahannya? Tapi kurung kurawal ini
Jawaban:
sedikit lebih pendek dari itu semua (dan lebih aman - berkaitan dengan spasi putih dalam nama file dan nama direktori).
Skrip Anda mungkin gagal untuk entri yang tidak memiliki
.
nama mereka, membuatnya$extension
kosong.sumber
find
bersifat rekursif secara default. Anda dapat membatasi kedalaman jika Anda mau (lihat halaman manual).Contoh: Untuk menemukan semua
csv
file di direktori saat ini dan sub-direktori, gunakan:sumber
Sintaks yang saya gunakan sedikit berbeda dari yang disarankan @Matt:
(kurang satu penekanan tombol).
sumber
Tanpa menggunakan
find
:sumber
grep
perlu di sini.awk
memiliki ekspresi reguler dan dapat membatasi output ke nilai yang cocok dengan suatu pola.awk|grep
adalah anti-pola. Biarkan awk melakukan grepping.{
hilang setelah itubrowsefolders ()
$in
harus$suffix
cut
membuat Anda hanya bagian tengahfront.middle.extension
. Anda harus membaca manual shell Anda${varname%%pattern}
dan teman-teman.Saya menganggap Anda melakukan ini sebagai latihan dalam skrip shell, sebaliknya
find
solusi yang sudah diusulkan adalah cara untuk pergi.Untuk memeriksa sintaks shell yang tepat, tanpa menjalankan skrip, gunakan
sh -n scriptname
.sumber
sumber
Meskipun menggunakan
find
perintah dapat berguna di sini, shell itu sendiri menyediakan opsi untuk mencapai persyaratan ini tanpa alat pihak ketiga. Itubash
shell menyediakan pilihan dukungan gumpal diperpanjang menggunakan yang Anda dapat mendapatkan nama file di bawah jalur rekursif bahwa pertandingan dengan ekstensi yang Anda inginkan.Opsi yang diperluas adalah
extglob
yang perlu diatur menggunakanshopt
opsi seperti di bawah ini. Opsi diaktifkan dengan-s
dukungan dan dinonaktifkan dengan-u
bendera. Selain itu Anda dapat menggunakan beberapa opsi lebih banyak yaitunullglob
di mana gumpalan yang tak tertandingi dihanyutkan seluruhnya, diganti dengan serangkaian kata-kata nol. Danglobstar
itu memungkinkan untuk berulang melalui semua direktoriSekarang yang perlu Anda lakukan adalah membentuk ekspresi glob untuk menyertakan file-file dari ekstensi tertentu yang dapat Anda lakukan seperti di bawah ini. Kami menggunakan array untuk mengisi hasil glob karena ketika dikutip dengan benar dan diperluas, nama file dengan karakter khusus akan tetap utuh dan tidak rusak karena pemisahan kata oleh shell.
Misalnya untuk mendaftar semua
*.csv
file di jalur rekursifPilihannya
**
adalah berulang melalui sub-folder dan*.csv
merupakan ekspansi global untuk memasukkan file ekstensi yang disebutkan. Sekarang untuk mencetak file yang sebenarnya, lakukan sajaMenggunakan array dan melakukan ekspansi kutipan yang tepat adalah cara yang tepat ketika digunakan dalam skrip shell, tetapi untuk penggunaan interaktif, Anda bisa menggunakan
ls
dengan ekspresi glob sebagaiIni bisa sangat diperluas untuk mencocokkan beberapa file yaitu file yang diakhiri dengan beberapa ekstensi (yaitu mirip dengan menambahkan beberapa flag dalam
find
perintah). Sebagai contoh, pertimbangkan kasus yang membutuhkan untuk mendapatkan semua file gambar rekursif yaitu ekstensi*.gif
,*.png
dan*.jpg
, yang Anda butuhkan adalahIni bisa sangat diperluas untuk memiliki hasil negasi juga. Dengan sintaksis yang sama, seseorang dapat menggunakan hasil dari glob untuk mengecualikan file dari tipe tertentu. Anggap Anda ingin mengecualikan nama file dengan ekstensi di atas, Anda bisa melakukannya
Konstruksinya
!()
adalah operasi meniadakan untuk tidak menyertakan ekstensi file yang tercantum di dalam dan|
merupakan operator bergantian seperti yang digunakan di pustaka Ekspresi Reguler Diperpanjang untuk melakukan pencocokan ATAU dari gumpalan.Perhatikan bahwa dukungan glob yang diperluas ini tidak tersedia di shell bourne POSIX dan murni khusus untuk versi terbaru dari
bash
. Jadi jika Anda mempertimbangkan portabilitas skrip yang berjalan di POSIX danbash
shell, opsi ini tidak akan tepat.sumber
Untuk menemukan semua
pom.xml
file di direktori Anda saat ini dan mencetaknya, Anda dapat menggunakan:sumber
sumber
sumber