用于遍历目录的Shell脚本

时间:2012-05-16 01:41:51

标签: bash

我正在开发一个需要批量处理大量图像文件的项目。为了简化操作,我编写了一个脚本,用于创建n目录,并根据用户输入将m文件移动到它们。

我的问题是现在通过shell脚本了解目录遍历。

我已在上述排序脚本的末尾添加了此代码段

dirlist=$(find $1 -mindepth 1 -maxdepth 1 -type d)

for dir in $dirlist
do
  cd $dir
  echo $dir
  ls
done

当我在Pano2文件夹中运行它时,包含两个内部文件夹,我总是遇到错误

./dirTravel: line 9: cd: Pano2/05-15-2012-2: No such file or directory

然而,在那之后,我从指定目录获取文件列表。

警告背后的原因是什么?如果我在cd ../之后添加ls,我会在Pano2 /中找到文件夹的列表,但不是文件本身。

3 个答案:

答案 0 :(得分:3)

我的猜测是你进入了两个级别,但只是回到了一个级别。尝试在cd ../..之后添加ls,或者使用pushdpopd

例如:

for dir in $dirlist
do
  pushd $dir
  echo $dir
  ls
  popd
done

正如@shellter指出的那样,如果这些目录有空格,那么这样的东西可能会更好:

find $1 -mindepth 1 -maxdepth 1 -type d | while read -r dir
do
  pushd "$dir"  # note the quotes, which encapsulate whitespace
  echo $dir
  ls
  popd
done

答案 1 :(得分:3)

我建议使用子shell切换目录:

dirlist=$(find $1 -mindepth 1 -maxdepth 1 -type d)

for dir in $dirlist
do
  (
  cd $dir
  echo $dir
  ls
  )
done

子shell中的代码不会影响父shell,因此它可以在任何地方更改目录,而不会给你任何关于“如何取回”的问题。

如果您的目录名称可以包含空格,换行符或其他意外和笨拙的字符,那么标准警告就是整个过程非常充实。如果您使用可移植文件名字符集([-_.A-Za-z0-9]),则不会遇到写入的问题。

答案 2 :(得分:2)

没有任何理由cd到目录运行ls命令。以下应该有效:

find "$1" -mindepth 1 -maxdepth 1 -type d -exec ls {} \;

如果这只是一个示例,并且您确实运行了依赖于工作目录的其他命令,则可以将bash -c与-exec一起使用:

find "$1" -mindepth 1 -maxdepth 1 -type d -exec bash -c 'cd "$1"; echo "$1"; ls' -- {} \;

bash -c调用会生成一个子shell,因此您无需担心它会更改当前shell的目录。