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

Batch copy and rename multiple files in the same directory

我有 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
...

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

我真的不确定我怎样才能做到这一点。我试图在 bash 脚本中使用 for 循环。但甚至不确定我需要什么 select 作为 for 循环索引。

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

无效。

您不能在单个 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

将有很多方法将这个切片 n-dice ...

一个想法使用 for 循环,printf + 大括号扩展,以及 xargs:

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

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

printf -v prefixes "%s\n" {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

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