Saya menulis skrip membangun malam di bash.
Semuanya baik-baik saja dan keren kecuali untuk satu hambatan kecil:
#!/bin/bash
for file in "$PATH_TO_SOMEWHERE"; do
if [ -d $file ]
then
# do something directory-ish
else
if [ "$file" == "*.txt" ] # this is the snag
then
# do something txt-ish
fi
fi
done;
Masalah saya adalah menentukan ekstensi file dan kemudian bertindak sesuai. Saya tahu masalahnya ada di pernyataan if, menguji file txt.
Bagaimana saya bisa menentukan apakah suatu file memiliki akhiran .txt?
$(dirname $PATH_TO_SOMEWHERE)
dan$(basename $PATH_TO_SOMEWHERE)
memecah menjadi folder dan direktori dan melakukan sesuatu direktori-ish dan file-ishJawaban:
Saya pikir Anda ingin mengatakan "Apakah empat karakter terakhir dari $ file sama dengan
.txt
?" Jika demikian, Anda dapat menggunakan yang berikut ini:Perhatikan bahwa ruang antara
file:
dan-4
diperlukan, karena pengubah ': -' berarti sesuatu yang berbeda.sumber
${var:-4}
tidak sama dengan${var: -4}
; yang pertama (tanpa spasi) akan berkembang sebagai '-4' jika var tidak disetel yang kedua (dengan spasi) mengembalikan 4 karakter terakhir dari var.if [ "${file: -4}" == ".txt" ]
sebagai gantinya.Membuat
seperti ini:
Yaitu, kurung ganda dan tidak ada tanda kutip.
Sisi kanan
==
adalah pola shell. Jika Anda memerlukan ekspresi reguler, gunakan=~
kemudian.sumber
if
pernyataan multi-kondisi . Saya membagikannya di sini kalau-kalau itu membantu seseorang.if [[ ( $file == *.csv ) || ( $file == *.png ) ]]
if [[ $file =~ .*\.(csv|png) ]]
. Ini lebih pendek, lebih jelas, lebih mudah untuk menambahkan ekstensi tambahan dan dapat dengan mudah dibuat dapat dikonfigurasi (dengan meletakkan "csv | png" dalam sebuah variabel).if [[ "$file" == *.txt ]]
Jika file memiliki spasi dalam namanya, kutip ganda diperlukan.Anda tidak bisa memastikan pada sistem Unix, bahwa file .txt benar-benar file teks. Taruhan terbaik Anda adalah menggunakan "file". Mungkin coba gunakan:
Kemudian Anda dapat menggunakan daftar tipe MIME yang cocok atau parsing bagian pertama MIME di mana Anda mendapatkan barang-barang seperti "teks", "aplikasi", dll.
sumber
file -i...
termasuk penyandian mime, Anda dapat menggunakanfile --mime-type -b ...
Anda dapat menggunakan perintah "file" jika Anda benar-benar ingin mengetahui informasi tentang file daripada mengandalkan ekstensi.
Jika Anda merasa nyaman menggunakan ekstensi, Anda dapat menggunakan grep untuk melihat apakah ekstensi cocok.
sumber
file
perintahnya. Saya sebenarnya telah mencoba mencocokkan berdasarkan pada output dari perintah yang dikatakan ... tapi saya gagal dengan sangat buruk pada pernyataan-pernyataan ini.Anda juga bisa:
sumber
case $FILE in *.txt ) ... ;; esac
akan tampak lebih kuat dan idiomatis.Mirip dengan 'file', gunakan 'mimetype -b' yang sedikit lebih sederhana yang akan berfungsi apa pun ekstensi file.
Sunting: Anda mungkin perlu menginstal libfile-mimeinfo-perl pada sistem Anda jika mimetype tidak tersedia
sumber
Jawaban yang benar tentang bagaimana mengambil ekstensi yang tersedia dalam nama file di linux adalah:
Contoh pencetakan semua ekstensi file dalam direktori
sumber
Saya menulis skrip bash yang melihat jenis file kemudian menyalinnya ke lokasi, saya menggunakannya untuk melihat melalui video yang saya tonton online dari cache firefox saya:
Ini menggunakan ide yang mirip dengan yang disajikan di sini, semoga ini bermanfaat bagi seseorang.
sumber
Saya kira itu
'$PATH_TO_SOMEWHERE'
seperti sesuatu'<directory>/*'
.Dalam hal ini, saya akan mengubah kode ke:
Jika Anda ingin melakukan sesuatu yang lebih rumit dengan direktori dan nama file teks, Anda dapat:
Jika Anda memiliki spasi pada nama file Anda, Anda dapat:
sumber
for
danwhile
loop sebaiknya disediakan ketika loop body perlu lebih kompleks.