ファイルが特定の文字で始まり、シェルスクリプトでファイル拡張子の末尾にピリオドを除いて特殊文字が含まれていないことをテストします。

ファイルが特定の文字で始まり、シェルスクリプトでファイル拡張子の末尾にピリオドを除いて特殊文字が含まれていないことをテストします。

フォルダ内の複数のテキストファイルに対してコマンドを実行するために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

など。

関連情報