正確なファイル名がわからない場合は、次のようにすることができます。
find /users/tnea01 -maxdepth 1 -name '*.log' -type f -exec sh -c \
'for f; do
gzip -c <"$f" >"/users/tnea01/logfile_archive/${f##*/}_$(date -r "$f" +%F).gz"
done' _ {} +
動く駒を説明するには:
- 安全に使用する唯一の方法
sh -c
は、完全に一定の文字列を使用することです。その中に変数 (ファイル名を含む) を代入すると、セキュリティの脆弱性が生じます。したがって、コードではいかなる種類の置換機能も使用しませんが、ファイル名を追加の引数として渡します。
for f; do
-- と同じですfor f in "$@"; do
-- すべてのコマンド ライン引数を反復処理します。
${f**#/}
最後の/
inの後のすべてに評価され$f
ます。パラメータ展開に関する bash-hackers ページを参照してください。
- を含む展開は、
$(date ...)
安全のために二重引用符で囲まれたコンテキスト内にある必要があります。ここでは、宛先ファイル名全体をそのような引用符で囲んでいます。
しかし、あなたがそうしているので、それはまったく必要ありません。
f=/users/tnea01/logfile10.log
d=/users/tnea01/logfile_archive
gzip -c <"$f" >"$d/${f##*/}_$(date -r "$f" +%F).gz"