タイムスタンププレフィックスを追加し、ファイルに拡張子を追加するためにスクリプトを使用しようとしています。ファイルがありますアルファベット私は次に名前が変わります。ABC.txt
DIRECTORY=`find /path/to/file -type f ! -name "*.*"`
NOW=$(date +%Y-%m-%d-%H%M%S)
for file in $DIRECTORY; do
mv "$file" "$file"_"${NOW}.txt"
done
上記の出力は機能しますが、切り替えるとサフィックスとして使用されます。
mv "$file" "${NOW}"$file".txt"
ますますできません。mv: `2019-10-18-231254/path/to/file/ABC.txt' を移動できません。そのファイルやディレクトリはありません。
mvの実行時に呼び出されるフルパスなので、$ Directoryに問題があることがわかります。誰でもこれを単純化するのに役立ちますか?
ベストアンサー1
find
次の理由でコマンド出力を繰り返さないことをお勧めします。
代わりに-execdir
パスコンポーネントを削除するには、およびシェルシングルライナーを使用することをお勧めします。
#!/bin/bash
export NOW=$(date +%Y-%m-%d-%H%M%S)
find /path/to/file -type f ! -name '*.*' -execdir sh -c '
for f; do echo mv "$f" "${NOW}_${f#./}"; done
' find-sh {} +
echo
正しいことをしていると思われる場合は削除してください。NOW
その値をサブシェルで使用できるようにエクスポートする必要がありますsh -c
。
find
実装がパスを提供していない場合は、明示的なパスの削除と置き換えを-execdir
使用できます。-exec
find /path/to/file -type f ! -name '*.*' -exec sh -c '
p="${1%/*}"; echo mv "$1" "$p/${NOW}_${1##*/}"
' find-sh {} \;