タイムスタンププレフィックスを追加し、ファイルに拡張子を追加するためにスクリプトを使用しようとしています。ファイルがありますアルファベット私は次に名前が変わります。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 {} \;
答え2
GNU並列処理を使用する:
find /path/to/file -type f ! -name "*.*" -print0 |
parallel -0 mv {} {//}/$(date +%Y-%m-%d-%H%M%S)_{/}.txt
タイムスタンプにISO8601を使用することを検討してください。
find /path/to/file -type f ! -name "*.*" -print0 |
parallel -0 mv {} {//}/$(date +%Y-%m-%dT%H:%M:%S)_{/}.txt
または:
find /path/to/file -type f ! -name "*.*" -print0 |
parallel -0 mv {} {//}/$(date +%Y%m%dT%H%M%S)_{/}.txt
これは、後で標準化されたISO8601パーサーを使用してタイムスタンプを解析できることを意味します。