我正在做一个需要批量处理大量图像文件的项目。为了使事情更容易,我编写了一个脚本,该脚本将根据用户输入创建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/ 中的文件夹列表而不是文件本身之后添加。
我建议使用子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]),您将不会遇到书面问题。
我的猜测是,您将进入两层深处,但只返回一层。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)
| 归档时间: |
|
| 查看次数: |
21214 次 |
| 最近记录: |