我正在开发一个需要批量处理大量图像文件的项目。为了简化操作,我编写了一个脚本,用于创建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 /中找到文件夹的列表,但不是文件本身。
答案 0 :(得分:3)
我的猜测是你进入了两个级别,但只是回到了一个级别。尝试在cd ../..
之后添加ls
,或者使用pushd
和popd
。
例如:
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的目录。