フルパスでファイル(プレフィックス)の名前を変更しますか?

フルパスでファイル(プレフィックス)の名前を変更しますか?

次のようにファイルにプレフィックス ( .dat) を付けます:

CLY_BIZ_COM_PERD.dat -> 20160622CLY_BIZ_COM_PERD.dat

私は次のことを試しました:

key=`date "+%Y%m%d"`
for i in $(ls /Path/*.dat); do mv ${i} "${key}${i}" ;done

しかし、このコマンドサフィックスファイルにプレフィックスを付けないようにします。どうすればいいですか?

答え1

現在のスクリプトに 2 つの変更を加えます。

  1. しない解析ls;代わりに頼る殻の塊について

  2. ファイルはサブディレクトリにあるため、cdまずそこに行ってループを実行するか、またはプレフィックスを追加する前に、basenameand を使用してファイルのディレクトリとファイル名の部分を抽出します。dirname

(注: ルート レベルの /Path ディレクトリを作成したくなかったため、「/Path」を「./Path」に変更しました。ただし、同じ原則が適用されます。

サンプルファイルを設定するには:

mkdir Path && cd Path
touch CLY_BIZ_COM_PERD.dat jeff.dat a.dat c\ d.dat
cd ..

以下にリハーサルの様子を示します。

for f in ./Path/*.dat
do 
  printf "mv '%s' '%s'\n" "$f" "$(dirname "$f")/${key}$(basename "$f")"
done

ドライランの出力:

mv './Path/a.dat' './Path/20160622a.dat'
mv './Path/c d.dat' './Path/20160622c d.dat'
mv './Path/CLY_BIZ_COM_PERD.dat' './Path/20160622CLY_BIZ_COM_PERD.dat'
mv './Path/jeff.dat' './Path/20160622jeff.dat'

満足したら、実際に実行してみましょう。

for f in ./Path/*.dat
do 
  mv "$f" "$(dirname "$f")/${key}$(basename "$f")"
done

...そして結果は次の通りです:

$ ls -1 Path
20160622a.dat
20160622c d.dat
20160622CLY_BIZ_COM_PERD.dat
20160622jeff.dat

関連情報