同じ文字列/パターンで終わるファイルがあるかどうかを確認するのに問題があります。ファイル名は次のようになります。
abs_123.unl
xyz_123.unl
現在私のコードは次のとおりです。単一ファイルでは正常に動作しますが、同じパターンのファイルが複数ある場合、if条件は失敗します。
if [ -s $AZWORK/*$PRCSID.unl ]
then
tar -cvzf $WORK/INET_$PRCSID.unl.gz $WORK/*$PRCSID.unl
fi
ここで、$PCSID はファイルの最後の 3 桁を表します。
このシェルスクリプトを複数のファイルで動作させるにはどうすればよいですか?
ベストアンサー1
ファイルの「検索」と「サイズの調整」を次のユーザーに委任しますfind
。
find "$WORK" -maxdepth 1 -name "*$PRCSID.unl" -type f ! -size 0 -print0 | \
xargs -0 --no-run-if-empty tar -cvzf "$WORK/INET_$PRCSID.unl.gz"
"*_123.unl"
これにより、そのパターンが存在する可能性があるサブディレクトリをフィルタリングすることもできます。
オプションfind
:
-maxdepth 1
サブディレクトリへの再帰防止-name "*$PRCSID.unl"
*
シェルの拡張を防ぐために、ファイル名を引用してファイル名と一致させます。-type f
ファイルのみ! -size 0
サイズが大事です!-print0
NULで区切られた名前を印刷します。ここでは必ずしも必要ではありませんが、ファイル名に改行文字が含まれていても問題になりません。
オプション/パラメータxargs
:
-0
stdinがNULで区切られているとします(改行で区切られていません)。--no-run-if-empty
標準入力にデータがない場合は実行されません(つまり、findには出力があります)。- 残りの行は、実行するコマンドでstdinのデータを引数として追加します。