在dir中共享公共ID的所有文件上运行脚本

时间:2017-05-31 15:31:23

标签: bash shell

我在目录中有一些文件:

A573R25.file_1.txt
A573R25.file_2.txt
A573R25.file_3.txt
A573R27.file_1.txt
A573R27.file_2.txt
A573R29.file_1.txt
A573R29.file_2.txt
A573R29.file_3.txt
A573R31.file_1.txt
A573R31.file_2.txt
A573R31.file_3.txt
A573R33.file_1.txt
A573R33.file_2.txt
A573R33.file_3.txt

我想在共享公共ID的所有文件上运行脚本(但是使用不同的文本分隔ID(例如A573R25)和.txt)。例如:

perl my_script.pl A573R25*.txt

但是,我想在bash脚本中为dir中的所有文件执行此操作。

以下是我尝试的内容:

samples+=$(ls -1 *.txt | cut -d '.' -f 1)

for ((i=0;i<${#samples[@]};++i))
do
  ls -1 ${samples[i]}*.txt

完成

但在每种情况下我都得到(例如): ls: A573R25: No such file or directory

我对第一个ID的预期输出是:

A573R25.file_1.txt
A573R25.file_2.txt
A573R25.file_3.txt

我做错了什么?

1 个答案:

答案 0 :(得分:3)

您的样本集中需要sort -u,它需要是一个数组:

samples+=( $( ls -1 *.txt | cut -d '.' -f 1 | sort -u ) )

以下是完整的代码和结果:

$ unset samples
$ samples+=( $(ls -1 *.txt | cut -d '.' -f 1 | sort -u ) )
$ for ((i=0;i<${#samples[@]};++i)); do ls -1 ${samples[i]}*.txt; done
A573R25.file_1.txt
A573R25.file_2.txt
A573R25.file_3.txt
A573R27.file_1.txt
A573R27.file_2.txt
A573R29.file_1.txt
A573R29.file_2.txt
A573R29.file_3.txt
A573R31.file_1.txt
A573R31.file_2.txt
A573R31.file_3.txt
A573R33.file_1.txt
A573R33.file_2.txt
A573R33.file_3.txt