lsコマンドの結果をフィルタリングし、フォーマットに応じて特定のファイル名のみを取得します。

lsコマンドの結果をフィルタリングし、フォーマットに応じて特定のファイル名のみを取得します。

g_inboundDir次のファイルを含むディレクトリがあります。XAI-001-20170709-123456791.pdf YXAI-001-20170709-123456791.pdf 001-20170744-123456791.pdf

Variable g_filPfix="XAI" Variable g_fileExt=".pdf"

これで、XAIで始まるすべてのファイルを選択して処理しようとしています。これを行うには、次のコマンドを作成しました。

for i in `ls ${g_inboundDir}/* | grep -E '^${g_filPfix}-([0-9]{3})-([0-9]{8})-([0-9]{9})${g_fileExt}$' 2>/dev/null`

XAI-001-20170709-123456791.pdf ファイルのみを受け取ると予想しましたが、何も受け取りませんでした。

答え1

解析されていませんls

for file in "${g_inboundDir}"/XAI*.pdf; do 
    things_to "$file"
done

答え2

grep -E '^${g_filPfix}-([0-9]{3})-([0-9]{8})-([0-9]{9})${g_fileExt}$'

ここでの即時の問題は、forパターンがgrep一重引用符で囲まれているため、シェルが変数g_filPfixsumを拡張しないことですg_fileExt。引用符を二重引用符に置き換えると、問題は解決されます。 (そしてパターンには括弧は必要ありません。)

ls空白または奇妙な文字を含むファイル名に対して同様の出力を解析するのに問題がある可能性があります。特に、間にスペースがあるファイル名は2つのファイル名として扱われます。

実際にこれらの厳密なパターンが必要ない場合は、与えられた接頭辞と接尾辞を持つすべてのファイルを処理できます。

for f in "$dir/$prefix"*"$suffix" ; do 
    somecmd "$f"
done

厳密なパターンが本当に必要な場合は、一部のシェル(LinuxのBashなど)は外部ツールなしで正規表現のマッチングを実行できます。したがって、ディレクトリ内のすべてのファイルを繰り返し、パターンと一致しないファイルを無視するには、次の手順を実行します。

for f in "$dir"/* ; do 
    [[ "$f" =~ "/$prefix"-[0-9]{3}-[0-9]{8}-[0-9]{9}"$suffix"$ ]] || continue
    somecmd "$f"
done

答え3

lsをgrepしないでください。代わりにfindとregexpを使用してください。

find ${g_inboundDir} -regextype sed -regex "^${g_filPfix}-([0-9]{3})-([0-9]{8})-([0-9]{9})${g_fileExt}$"

最後に、-execを使用してこれらのファイルに対して特定のタスクを実行できます。
確認する人々が見つけた検索の詳細を学んでください:)

関連情報