ディレクトリに複数のファイルがあることを確認し、同じファイルを圧縮する方法

ディレクトリに複数のファイルがあることを確認し、同じファイルを圧縮する方法

同じ文字列/パターンで終わるファイルがあるかどうかを確認するのに問題があります。ファイル名は次のようになります。

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サイズが大事です!
  • -print0NULで区切られた名前を印刷します。ここでは必ずしも必要ではありませんが、ファイル名に改行文字が含まれていても問題になりません。

オプション/パラメータxargs

  • -0stdinがNULで区切られているとします(改行で区切られていません)。
  • --no-run-if-empty標準入力にデータがない場合は実行されません(つまり、findには出力があります)。
  • 残りの行は、実行するコマンドでstdinのデータを引数として追加します。

おすすめ記事