循环遍历文件名

循环遍历文件名

我需要使用一个具有多个文件作为输入的函数。这些文件通过文件名相关(例如,dog1_animal.txt、dog2_animal.txt、dog3_animal.txt、cat1_animal.txt、cat2_animal.txt、cat3_animal.txt 等...)我的想法是检查那些文件用类似的模式命名,但重点是我不想编写该模式,但代码应该识别这些文件中哪个文件具有相似的名称并将它们发送到函数。我每个类别都有三个文件;我以为嵌套循环可以工作,实际上不是这样的

for file in *.txt; 
do for file2 in *.txt; 
do for file3 in *.txt;
do if [[ "${file3%_*}" == "${file2%_*}" ]] && [[ "${file3%_*}" == "${file2%_*}" ]] && [[ $file1 != $file3 ]] && [[ $file3 != $file1 ]] && [[ $file3 != $file1 ]]; 
then
        :
fi; 
done;
done;
echo "${file%_*}${file2%_*}${file3%_*}"; ##my supposed comand that 
uses file file2 file 3
done

问题是它应该迭代所有文件,找到那些具有相似名称的文件,在函数中使用它们,再次,直到处理完所有文件。

答案1

假设您知道您总是希望以三个一组的方式使用文件,并且模式*.txt匹配全部相关文件(仅此而已),并且文件已正确排序(正如您在问题中提到的那样)。

此外,假设您想some_utility一次调用一些以三个文件为一组的实用程序,那么您可以使用以下命令来执行此操作xargs

printf '%s\0' *.txt | xargs -0 -n 3 some_utility

这将使用 . 生成一个以 nul 分隔的文件名列表printf。该列表将被发送到xargs,它会一次挑选三个名字并some_utility以这些名字作为参数进行调用。当实用程序终止时,它将对接下来的三个文件名执行相同的操作,依此类推。

测试(用echo):

$ touch {dog,cat,mouse,horse}{1..3}_animal.txt     
$ touch {tree,flower}{1..3}_plant.txt
$ printf '%s\0' *.txt | xargs -0 -n 3 echo
cat1_animal.txt cat2_animal.txt cat3_animal.txt
dog1_animal.txt dog2_animal.txt dog3_animal.txt
flower1_plant.txt flower2_plant.txt flower3_plant.txt
horse1_animal.txt horse2_animal.txt horse3_animal.txt
mouse1_animal.txt mouse2_animal.txt mouse3_animal.txt
tree1_plant.txt tree2_plant.txt tree3_plant.txt

使用与上面相同的文件的稍微复杂的示例:

$ printf '%s\0' *.txt | xargs -0 -n 3 bash -c 'printf "%s %s %s\n" "${@%_*}"' bash
cat1 cat2 cat3
dog1 dog2 dog3
flower1 flower2 flower3
horse1 horse2 horse3
mouse1 mouse2 mouse3
tree1 tree2 tree3

相关内容