フォルダ内の複数のテキストファイルに対してコマンドを実行するためにforループを実行するシェルスクリプトがあります。これらのファイルの名前が特定の文字セット(NAなど)で始まるか、ファイルに特殊文字がないか(たとえば、「-」、「_」などのファイル拡張子の前にピリオドがない場合を除く)、テストしたいと思います。ファイルのフルネームをテストする方法を知っていますが、ファイルの一部にこれらの文字が含まれているかどうかをテストする方法や文字と数字のみが含まれています。これらの要件を満たすファイルでのみコマンドを実行するにはどうすればよいですか?私はそれがif文を使用していることを知っていますが、それ以上はわかりません。ワイルドカードや正規表現を使用する場合のようです。
答え1
以下のコードを使用すると、「NA」で始まり、英数字のみを含み、「.txt」で終わるテキストファイルに対して特定の操作を実行できます。
for f in /path/to/your/folder/*; do
if [[ ${f##*/} =~ NA[a-zA-Z0-9]*.txt ]]; then
# perform some action on $f
fi
done
ファイルが「N」または「A」で始まるようにするには、次のコマンドを使用します。
for f in /path/to/your/folder/*; do
if [[ ${f##*/} =~ [N,A][a-zA-Z0-9]*.txt ]]; then
# perform some action on $f
fi
done
答え2
クイックハッキングは次のとおりです。
#!/bin/bash
for i in *;
do
if [ $(echo $i|cut -c 1-2) == "NA" ];
then
EXECUTE_COMMAND
fi
done
あなたの質問を正しく理解していますか?
答え3
シェルがそれをサポートしている場合は、拡張ワイルドカードを使用できます。
強く打つ:
shopt -s extglob
for f in NA*([[:alnum:]]).txt; do something; done
扱いにくい:
setopt extendedglob
for f in NA([[:alnum:]])#.txt; do something; done
ここで*(...)
、およびは(...)#
それぞれゼロ個以上の発生を示します。
答え4
egrepは次のことを行う必要があります。
egrep 'NA[A-Z a-z 0-9]*\..{3,4}$'
したがって、ls /path/to/dir | egrep 'NA[A-Z a-z 0-9]*\..{3,4}$'
次のようにリストされます。
NAfoo.txt
NAbar1.jpeg
NA123baz.txt
ただし、以下は除外されます。
aiNA1foo.txt
NA2foo_bar.jpeg
NAbar.baz.txt
など。