Saya mencoba menulis if
pernyataan untuk menguji apakah ada file yang cocok dengan pola tertentu. Jika ada file teks dalam direktori, itu harus menjalankan skrip yang diberikan.
Kode saya saat ini:
if [ -f /*.txt ]; then ./script fi
Tolong beri beberapa ide; Saya hanya ingin menjalankan skrip jika ada .txt
dalam direktori.
Jawaban yang Diterima:
[ -f /*.txt ]
akan mengembalikan true hanya jika ada satu (dan hanya satu) file tidak tersembunyi di /
yang namanya berakhiran .txt
dan jika file itu adalah file biasa atau symlink ke file biasa.
Itu karena wildcard diperluas oleh shell sebelum diteruskan ke perintah (di sini [
).
Jadi jika ada /a.txt
dan /b.txt
, [
akan melewati 5 argumen:[
, -f
, /a.txt
, /b.txt
dan ]
. [
kemudian akan mengeluh bahwa -f
diberikan terlalu banyak argumen.
Jika Anda ingin memeriksa bahwa *.txt
pola diperluas ke setidaknya satu file yang tidak disembunyikan (biasa atau tidak), di bash
cangkang:
shopt -s nullglob
set -- *.txt
if [ "$#" -gt 0 ]; then
./script "[email protected]" # call script with that list of files.
fi
# Or with bash arrays so you can keep the arguments:
files=( *.txt )
# apply C-style boolean on member count
(( ${#files[@]} )) && ./script "${files[@]}"
shopt -s nullglob
adalah bash
tertentu (shopt
adalah, nullglob
sebenarnya berasal dari zsh
), tetapi shell seperti ksh93
, zsh
, yash
, tcsh
memiliki pernyataan yang setara.
Dengan zsh
, tes untuk apakah ada file yang cocok dengan pola dapat ditulis menggunakan fungsi anonim dan N
(untuk nullglob
) dan Y1
(untuk berhenti setelah penemuan pertama) kualifikasi glob:
if ()(($#)) *.txt(NY1); then
do-something
fi
Perhatikan bahwa mereka menemukan file-file itu dengan membaca isi direktori, itu tidak mencoba dan mengakses file-file itu sama sekali yang membuatnya lebih efisien daripada solusi yang memanggil perintah seperti ls
atau stat
pada daftar file yang dihitung oleh shell.
sh
standard standar yang setara adalah:
set -- [*].txt *.txt
case "$1$2" in
('[*].txt*.txt') ;;
(*) shift; script "[email protected]"
esac
Masalahnya adalah bahwa dengan cangkang Bourne atau POSIX, jika suatu pola tidak cocok, pola itu akan meluas ke dirinya sendiri. Jadi jika *.txt
diperluas ke *.txt
, Anda tidak tahu apakah itu karena tidak ada .txt
file di direktori atau karena ada satu file bernama *.txt
. Menggunakan [*].txt *.txt
memungkinkan untuk membedakan antara keduanya.
Sekarang, jika Anda ingin memeriksa bahwa *.txt
cocok dengan setidaknya satu reguler file atau symlink ke file biasa (seperti [ -f *.txt ]
. Anda menyarankan Anda ingin melakukannya), atau semua file yang cocok dengan *.txt
adalah biasa file (setelah resolusi symlink), itu masalah lain.
Dengan zsh
:
if ()(($#)) *.txt(NY1-.); then
echo "there is at least one regular .txt file"
fi
if ()(($#)) *.txt(NY1^-.); then
echo "there is at least one non-regular .txt files"
fi
(hapus -
jika Anda ingin melakukan pengujian sebelum resolusi symlink, yaitu menganggap symlink sebagai file non-reguler apakah menunjuk ke file biasa atau tidak).