ファイルの名前を変更し、日付と時刻のプレフィックスを追加します。

ファイルの名前を変更し、日付と時刻のプレフィックスを追加します。

タイムスタンププレフィックスを追加し、ファイルに拡張子を追加するためにスクリプトを使用しようとしています。ファイルがありますアルファベット私は次に名前が変わります。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パーサーを使用してタイムスタンプを解析できることを意味します。

関連情報