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
に一致するすべてのファイル 通常 ファイル(シンボリックリンクの解決後)、それはさらに別の問題です。
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
(-
を削除します シンボリックリンクを解決する前にテストを実行する場合、つまり、シンボリックリンクが通常のファイルを指しているかどうかに関係なく、非通常のファイルと見なします。