Bash循环遍历目录和文件名

时间:2013-09-16 14:39:29

标签: bash for-loop directory

我需要循环遍历各种目录和文件名,这些目录和文件名具有相同的名称,但是从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循环不起作用,我真的不明白为什么!有什么提示吗?谢谢。

2 个答案:

答案 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