GNU/Linux >> Belajar Linux >  >> Linux

Uji Apakah Ada File Yang Cocok Dengan Pola Untuk Mengeksekusi Skrip?

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.

Terkait:Bagaimana cara membuat skrip tabel tanpa kunci utama dan asing di Oracle?

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).


Linux
  1. Masukkan beberapa baris data ke file setelah pola cocok menggunakan skrip shell Linux

  2. File Cat Dengan Direktori?

  3. Script Untuk Menentukan Apakah File Adalah Gambar?

  1. Bagaimana Cara Mencari Di File Tertentu yang Sesuai Dengan Pola?

  2. Cara menguji skrip PHP

  3. Pencocokan pola skrip Bash

  1. Apakah ada program/skrip untuk memodifikasi file .conf?

  2. Salin semua pola pencocokan file dari dir dan subdir ke dalam satu dir

  3. Mengapa file .so dapat dieksekusi?