遍历目录的shell脚本

Jas*_*son 4 bash

我正在做一个需要批量处理大量图像文件的项目。为了使事情更容易,我编写了一个脚本,该脚本将根据用户输入创建n目录并将m文件移动到这些目录中。

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

我在上面描述的排序脚本的末尾添加了这个片段

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

for dir in $dirlist
do
  cd $dir
  echo $dir
  ls
done
Run Code Online (Sandbox Code Playgroud)

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

./dirTravel: line 9: cd: Pano2/05-15-2012-2: No such file or directory
Run Code Online (Sandbox Code Playgroud)

但是,在那之后,我从指定的目录中获取了文件列表。

警告背后的原因是什么?如果我cd ../ls获得 Pano2/ 中的文件夹列表而不是文件本身之后添加。

Jon*_*ler 5

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

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

for dir in $dirlist
do
  (
  cd $dir
  echo $dir
  ls
  )
done
Run Code Online (Sandbox Code Playgroud)

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

这附带了一个标准警告,即如果您的目录名称可以包含空格、换行符或其他意外和尴尬的字符,则整个过程会充满挑战。如果您使用可移植文件名字符集 ( [-_.A-Za-z0-9]),您将不会遇到书面问题。


Nat*_*ohl 4

我的猜测是,您将进入两层深处,但只返回一层。cd ../..尝试在 ,后面添加ls, 或使用pushdandpopd代替。

例如:

for dir in $dirlist
do
  pushd $dir
  echo $dir
  ls
  popd
done
Run Code Online (Sandbox Code Playgroud)

正如 @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
Run Code Online (Sandbox Code Playgroud)