set -x
for f in ~/1/2/*/*_1.txt; do
subdir="${f%/*}"
pushd "$subdir" &>/dev/null
file="${f##*/}"
expTool INPUT1= "${f##*/}" INPUT2= "${f%_1.txt}_2.txt OUTPUT1= "${f%_1.txt}_3.txt" OUTPUT2= "${f%_2.txt}_4.txt"
done
expTool error: [Errno 2] No such file or directory: '*_1.txt'
我已经减去了引文,但这是行不通的。
编辑:使用 set -x
+for f in '/User/admin/1/2/*/*_1.txt'
+subdir='/User/admin/1/2/*'
+pushd '/User/admin/1/2/*'
+file='*_1.txt'
+expTool INPUT= '*_1.txt' OUTPUT= '${f%_1.txt}_2.txt'
所以看起来“*”语法没有被注册为通配符(?)。我使用的是 Mac OSX 10.8.6。
答案1
要么您set -f
在脚本中较早运行,这会禁用通配符扩展,要么没有匹配的文件。如果没有匹配文件,则模式保持不变,因此 for 循环在一个未更改模式的元素上运行。在 bash 中,您可以使用shopt -s nullglob
来创建不匹配的模式,而不是扩展到空列表。
答案2
我不确定我是否理解你的代码,
for f in ~/1/2/*/*_1.txt; do
fdn="${f%/*}"
fbn1="${f##*/}"
fbn2="${fbn1//_1/_2}"
fbn3="${fbn1//_1/_3}"
fbn4="${fbn1//_1/_4}"
expTool INPUT1= "$fdn/$fbn1" INPUT2= "$fdn/$fbn2" OUTPUT1= "$fdn/$fbn3" OUTPUT2= "$fdn/$fbn4"
done
如果我是主题请告诉我,我删除我的答案!