循环浏览术语列表并批量重命名文件



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

最新更新