对不起,但其他问题没有帮助我:/我想循环遍历一个目录,以便在某些文件上应用程序。问题是它还包含子目录。我的代码有什么问题?:
#!/bin/bash
for file in `find $path/* ( -name "*.txt" -o -name "*.out" ) -prune -maxdepth 1 -type f `;
do
program "$file" -outdir=$outdir;
done
不要在for
循环中使用find
的输出作为列表。当文件名包含空白字符时,它将不起作用,并且无论如何,为该任务调用外部命令是多余的。使用globs代替:
#!/bin/bash
shopt -s nullglob
for file in "$path"/*.txt "$path"/*.out; do
program "$file" -outdir="$outdir"
done
指出:
- 当启用
nullglob
选项时,当没有找到匹配该模式的文件时,该模式将从列表中删除。否则模式将保持不变。 "$path"/*.txt "$path"/*.out
可还原为"$path"/{*.txt,*.out}
。- 上面的模式将不匹配以点(
.
)开头的文件名,但如果需要,可以补救这个问题。 - 匹配模式的文件不一定是常规文件。在
for
循环体的顶部通过[[ -f "$file" ]] || continue
检查这一点可能是个好主意。