批量复制和重命名同一目录下的多个文件



我有20个文件,像:

01a_AAA_qwe.sh
01b_AAA_asd.sh
01c_AAA_zxc.sh
01d_AAA_rty.sh
...

文件在其名称中具有类似的格式。以01开头,格式为01*AAA*.sh。

我希望复制和重命名同一目录下的文件,将数字01改为02、03、04和05:

02a_AAA_qwe.sh
02b_AAA_asd.sh
02c_AAA_zxc.sh
02d_AAA_rty.sh
...
03a_AAA_qwe.sh
03b_AAA_asd.sh
03c_AAA_zxc.sh
03d_AAA_rty.sh
...
04a_AAA_qwe.sh
04b_AAA_asd.sh
04c_AAA_zxc.sh
04d_AAA_rty.sh
...
05a_AAA_qwe.sh
05b_AAA_asd.sh
05c_AAA_zxc.sh
05d_AAA_rty.sh
...

我想复制20个01*.sh文件到02*.sh, 03*.sh和04*.sh。这将使文件夹中的文件总数达到100个。

我真的不知道我怎么才能做到这一点。我试图在bash脚本中使用for循环。但是我甚至不确定我应该选择什么作为for循环的索引。

for i in {1..4}; do
cp 0${i}*.sh 0${i+1}*.sh
done

不工作

将有很多方法来分割这个…

使用for循环,printf+括号展开和xargs的一个想法:

for f in 01*.sh
do
printf "%sn" {02..05} | xargs -r -I PFX cp ${f} PFX${f:2}
done

同样的事情,但将printf保存在前面的变量中:

printf -v prefixes "%sn" {02..05}
for f in 01*.sh
do
<<< "${prefixes}" xargs -r -I PFX cp ${f} PFX${f:2}
done

另一个使用一对for循环的想法:

for f in 01*.sh
do
for i in {02..05}
do
cp "${f}" "${i}${f:2}"
done
done

开始:

$ ls -1 0*.sh
01a_AAA_qwe.sh
01b_AAA_asd.sh
01c_AAA_zxc.sh
01d_AAA_rty.sh

所有建议的代码片段留给我们的是:

$ ls -1 0*.sh
01a_AAA_qwe.sh
01b_AAA_asd.sh
01c_AAA_zxc.sh
01d_AAA_rty.sh
02a_AAA_qwe.sh
02b_AAA_asd.sh
02c_AAA_zxc.sh
02d_AAA_rty.sh
03a_AAA_qwe.sh
03b_AAA_asd.sh
03c_AAA_zxc.sh
03d_AAA_rty.sh
04a_AAA_qwe.sh
04b_AAA_asd.sh
04c_AAA_zxc.sh
04d_AAA_rty.sh
05a_AAA_qwe.sh
05b_AAA_asd.sh
05c_AAA_zxc.sh
05d_AAA_rty.sh

注意:增加空白行以提高可读性

您不能在单个cp命令中进行多次复制,除非将一堆文件复制到单个目标目录。cp不会自动进行名称映射。通配符是由shell展开的,它们不会被命令本身看到,所以它们不可能像这样进行模式匹配。

为变量加1,使用$((i+1))

您可以使用shell子字符串展开运算符来获取文件名前两个字符之后的部分。

for i in {1..4}; do
for file in 0${i}*.sh; do
fileend=${file:2}
cp "$file" "0$((i+1))$fileend"
done
done