GNU/Linux >> Linux の 問題 >  >> Linux

スクリプトを実行するために、パターンに一致するファイルがあるかどうかをテストしますか?

ifを書き込もうとしています 特定のパターンに一致するファイルがあるかどうかをテストするステートメント。ディレクトリにテキストファイルがある場合は、特定のスクリプトを実行する必要があります。

現在の私のコード:

if [ -f /*.txt ]; then ./script fi

いくつかのアイデアを教えてください。 .txtがある場合にのみスクリプトを実行したい ディレクトリ内。

承認された回答:

[ -f /*.txt ]

1つがある場合にのみtrueを返します (そして1つだけ) /に隠されていないファイル 名前が.txtで終わる そのファイルが通常のファイルまたは通常のファイルへのシンボリックリンクである場合。

これは、ワイルドカードがコマンドに渡される前にシェルによって展開されるためです(ここでは [

したがって、 /a.txtがある場合 および/b.txt[ 5つの引数が渡されます: [ -f /a.txt /b.txt および][ 次に、 -fと文句を言います。 与えられた引数が多すぎます。

*。txtを確認したい場合 パターンは、 bash 内の少なくとも1つの隠しファイル(通常または非隠しファイル)に展開されます シェル:

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 bashです 特定の( shopt は、 nullglob 実際にはzshから来ています )、ただし ksh93のようなシェル 、 zsh yash tcsh 同等のステートメントがあります。

zshを使用 、パターンに一致するファイルがありますかのテスト 無名関数とNを使用して記述できます ( nullglobの場合 )および Y1 (最初の検索後に停止する)glob qualifier:

if ()(($#)) *.txt(NY1); then
  do-something
fi

ディレクトリの内容を読み取ることでこれらのファイルを見つけることに注意してください。これらのファイルにアクセスしようとはまったくしないため、 lsなどのコマンドを呼び出すソリューションよりも効率的です。 またはstat シェルによって計算されたファイルのリストにあります。

標準のsh 同等のものは次のようになります:

set -- [*].txt *.txt
case "$1$2" in
  ('[*].txt*.txt') ;;
  (*) shift; script "[email protected]"
esac

問題は、BourneまたはPOSIXシェルでは、パターンが一致しない場合、それ自体に拡張されることです。したがって、*。txtの場合 *。txtに展開されます 、 .txtがないためかどうかわかりません ディレクトリ内のファイル、または*。txtというファイルが1つあるため 。 [*]。txt*.txtを使用する 2つを区別することができます。

ここで、*。txtを確認したい場合 少なくとも1つの通常に一致します ファイルまたは通常のファイルへのシンボリックリンク( [-f * .txt] など) 実行することを提案します)、または*。txtに一致するすべてのファイル 通常 ファイル(シンボリックリンクの解決後)、それはさらに別の問題です。

関連:Oracleで主キーと外部キーを使用せずにテーブル作成スクリプトを生成するにはどうすればよいですか?

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

-を削除します シンボリックリンクを解決する前にテストを実行する場合、つまり、シンボリックリンクが通常のファイルを指しているかどうかに関係なく、非通常のファイルと見なします。


Linux
  1. Linuxシェルスクリプトを使用してパターンが一致した後、ファイルに複数行のデータを挿入します

  2. 特定のファイルを作成したプログラムまたはスクリプトを見つけることは可能ですか?

  3. 重複ファイルを見つけますか?

  1. パターンに一致する行を別のファイルの行に順番に置き換えますか?

  2. ファイルが画像であるかどうかを判断するためのスクリプト?

  3. PHP スクリプトをテストする方法

  1. bash スクリプトに少なくとも 2 つの引数が指定されていることを確認します

  2. なぜ .so ファイルは実行可能ですか?

  3. 特定のパターンに一致するファイルを見つけ、そのファイル名をシェル スクリプトの変数に値として指定しますか?