![フルパスでファイル(プレフィックス)の名前を変更しますか?](https://rvso.com/image/89180/%E3%83%95%E3%83%AB%E3%83%91%E3%82%B9%E3%81%A7%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB(%E3%83%97%E3%83%AC%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF%E3%82%B9)%E3%81%AE%E5%90%8D%E5%89%8D%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%97%E3%81%BE%E3%81%99%E3%81%8B%3F.png)
次のようにファイルにプレフィックス ( .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 つの変更を加えます。
ファイルはサブディレクトリにあるため、
cd
まずそこに行ってループを実行するか、またはプレフィックスを追加する前に、basename
and を使用してファイルのディレクトリとファイル名の部分を抽出します。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