我有一个很大的目录列表,每个目录都包含不同数量的“配对”文件。通过配对,我的意思是两个文件的前缀相同,并且这些对被表示为“a”和“b”。前缀也不遵循定义的模式。我的更广泛的意图是编写一个bash脚本,它将列出给定目录中的所有子目录,cd到每个目录,找到文件对,并在对上执行一个函数。这是一个示例目录:
Dir1
123_a.txt
234_a.txt
123_b.txt
234_b.txt
Dir2
345_a.txt
345_b.txt
Dir3
456_a.txt
567_a.txt
678_a.txt
456_b.txt
567_b.txt
678_b.txt
我可以使用此代码循环思考每个目录:
for d in ./*/ ; do (cd "$d" && script.sh); done
在script.sh中,我一直在编写一个脚本来查找所有文件对(这是我正在努力解决的问题),然后调用我想要应用于这些文件的函数。这是我一直在努力的要点:
for file in ./*_a.txt; do (find the paired file with *_b.txt && run_function.sh); done
我已经将问题分解为需要为_a.txt文件获取“*”的值,然后使用此值搜索目录以匹配_b.txt后缀,并创建一个我可以将它们放入的子目录所以我可以应用run_function.sh。所以Dir1将包含子目录123和234。
如果这没有意义,请告诉我。我正在努力解决的问题部分是匹配没有定义前缀的文件。
感谢您的帮助。
答案 0 :(得分:2)
使用参数扩展:
#!/bin/bash
file=123_a.txt
prefix=${file%_a.txt} # remove _a.txt from the right
second=${prefix}_b.txt
if [[ -f $second ]] ; then
run_function "$file" "$second"
fi