EDIT:在处理和重新编辑这个问题的过程中,我能够解决这个问题。但是,我相信有更好的方法可以做到这一点,所以我把它留给那些更有经验的人。
我需要定期复制几个文件的几十个副本。例如,给定:
company_a_results_30d.py
company_a_results_90d.py
company_a_results_120d.py
company_a_results_all_time.py
我需要在company_a
替换为company_b
的地方制作副本,company_c
....(下一步是在文件中查找并替换许多术语,但我设法用 perl 脚本完成了这项工作。
我相信这应该可以通过 bash 脚本和 mv
来实现,但我还没有完全掌握它的窍门。像这样:
#!/usr/bin/env bash
my_array=(company_b company_c company_d)
for i in "${my_array[@]}"
do
for file in *.py
do
cp "$file" "${file/company_a/$i}"
done
done
我更喜欢与zsh
兼容的解决方案,这就是我使用的。
bash
从OP的答案略有修改:
#!/usr/bin/env bash
set -x # So you can see what's happening - feel free to omit
company_a_files=(company_a*.py) # <== Save the list of files first
my_array=(company_b company_c company_d)
for i in "${my_array[@]}"
do
for file in "${company_a_files[@]}" # <== Use the saved list
do
cp "$file" "${file/company_a/$i}"
done
done
当OP的答案中的内部循环运行for file in *.py
时,glob将拾取已经创建的任何company_b
&c.文件。 所以你最终会得到很多set -x
输出,例如:
+ cp company_b_1.py company_b_1.py
cp: 'company_b_1.py' and 'company_b_1.py' are the same file
相反,首先将 company_a 文件的 glob 保存到 shell 数组中,然后遍历该数组。
佩尔
作为 Perl 5.14+ 的单行代码:
perl -MFile::Copy=copy -E 'for my $file (@ARGV) { copy $file, $file =~ s/company_a/$_/r foreach qw(company_b company_c company_d) }' company_a*.py
与 bash 版本相比,Perl 版本切换循环顺序。 对于命令行上给出的每个文件(for ... @ARGV
(,它会依次从该文件复制到每个名称修改的文件(foreach
(。
$file =~ s/company_a/$_/r
是一种非破坏性(/r
(替换$file
(文件名(,company_a
更改为$_
(foreach
的当前值(。
这是我想出的解决方案:
#!/usr/bin/env bash
my_array=(company_b company_c company_d)
for i in "${my_array[@]}"
do
for file in *.py
do
cp "$file" "${file/company_a/$i}"
done
done