批量复制和重命名同一目录中的多个文件
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
注意: 添加空行以提高可读性
我有 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
注意: 添加空行以提高可读性