我需要循环遍历各种目录和文件名,这些目录和文件名具有相同的名称,但是从001,002,003增加到1。
/Very/long/path/to/folder001/very_long_filename001.foobar
/Very/long/path/to/folder002/very_long_filename002.foobar
/Very/long/path/to/folder003/very_long_filename003.foobar
$FILES=/Very/long/path/to/folder*/very_long_filename*.foobar
for f in $FILES
do
echo "$f"
done
我上面写的for
循环不起作用,我真的不明白为什么!有什么提示吗?谢谢。
答案 0 :(得分:5)
改为使用数组:
FILES=(/Very/long/path/to/folder*/very_long_filename*.foobar)
for f in "${FILES[@]}"
do
echo "$f"
done
使其按顺序运行的另一种方法:
for i in $(seq -w 001 100); do
f="/Very/long/path/to/folder${i}/very_long_filename${i}.foobar"
[[ -e $f ]] || continue ## optional test.
echo "$f"
done
顺便说一下,自从for
开始作业后,$
循环无效:
`$FILES=...`
应该只是
FILES=/Very/long/path/to/folder*/very_long_filename*.foobar
仍然使用数组更安全,因为它在for
的扩展期间保留了文件名中的空格。
答案 1 :(得分:2)
首先,不要使用美元符号来分配变量:
FILES=/Very/long/path/to/folder*/very_long_filename*.foobar
根本不需要变量;你可以直接迭代一个glob模式:
for f in /Very/long/path/to/folder*/very_long_filename*.foobar; do