【发布时间】:2015-12-14 10:10:58
【问题描述】:
我的工作需要我循环浏览 BigDirectory 中的每个目录,然后遍历每个目录中的每个文件。比如:
for d in BigDirectory/*/
do
FILES=$d*
for f in $FILES
do
echo "File $f in directory $d"
done
done
我的问题是关于 FILES=$d*。当我在命令行中执行此命令时,它会像预期的那样工作 - 也就是说,对于单次迭代, echo $FILES 显示
BigDirectory/directory1/file1
BigDirectory/directory1/file2
BigDirectory/directory1/file3
但是当我将此脚本作为我的集群上的作业提交时,它不起作用 - 如果我要回显 $FILES,我会看到它一直在寻找具有文字文件名“BigDirectory/directory1/*”的东西- 就像它没有注册星号一样。
有人知道会发生什么吗?
编辑 对我有用的是将 shopt -s nullglob 放在每个循环之前,并在开头添加一行“cd 为集群定义在哪里查找文件(因此它不会扩展 *)。感谢您的帮助全部
【问题讨论】:
-
...将整个内容放入
FILES变量中只是有损/产生错误,因为这意味着您不能仅扩展第一部分而不扩展后者——在扩展$FILES时,要么引用它(最后的*不起作用)要么不引用(目录名称中的任何空格或 glob 都会导致该名称可能评估为某些东西除了自己)。现在,您可以做的是将 glob 的结果收集到一个变量中:files=( "$d"/* ); for file in "${files[@]}"; do echo "found file $file in $d"; done. -
如果您想要处理子树 BigDirectory 中或下的每个文件,您可能希望使用
find BigDirectory -type f -exec ...