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_filPfix
sumを拡張しないことです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を使用してこれらのファイルに対して特定のタスクを実行できます。
確認する人々が見つけた検索の詳細を学んでください:)