使用完整路径重命名文件(前缀)?

使用完整路径重命名文件(前缀)?

我想给我的文件添加前缀(.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

对当前脚本的两处更改:

  1. 解析ls;相反依赖关于 shell 的通配符

  2. 因为文件位于子目录中,所以要么cd先在子目录中运行循环,要么在添加前缀之前使用basenamedirname提取文件的目录和文件名部分。

(注意:我还将您的“/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

相关内容