在bash中循环浏览目录和子目录

鹿

我尝试了以下这一行,从包含要循环浏览的文件夹的父文件夹开始:

for dir in */; do  
    cd $dir  
    for dir2 in */; do  
        cd $dir2  
        ls -d $PWD/*  
        cd ..  
    done  
    cd ..  
done

但是它只输出我整个计算机的全部内容,然后返回到根文件夹/〜...对这种行为有任何解释吗?

散布

bash默认的“ globbing”(通配符匹配/扩展)行为是,如果通配符不匹配任何内容,则返回通配符表达式本身。因此,如果您cd进入的目录中没有子目录,您最终将尝试cd进入字面意义上的“ * /”(字面名称为星号的目录),该操作将失败,因此您将保留一个比您高的目录以为你会在循环中的这一点上。因此,当您到达时cd ..,您将再次成为上一个目录。最终,您将退回到文件系统的根级别。

许多shell脚本编写者find(1)在希望脚本遍历目录树时选择使用而不是shell循环。您的整个脚本片段将变为:

find . -type d

…或者,如果您确实想要绝对路径而不是相对路径:

find "$PWD" -type d

如果您要坚持使用shell循环,则可以尝试如下操作:

#!/bin/bash
set -evx
for dir in */; do
    if [ -d "$dir" ]; then
        cd "$dir"
        for dir2 in */; do
            if [ -d "$dir2" ]; then
                cd "$dir2"
                ls -d "$PWD"/*
                cd ..
            fi
        done
        cd ..
    fi
done

请注意,我如何使用if语句来测试的每个值dirdir2确保它们是真正的目录,如果不是,则跳过它们。

还要注意这一set -evx行,这是您初次编写/调试脚本时要设置的一组不错的选项:
-e在出现第一个错误时停止。
-v在执行前打印每一行。在执行所有各种替换/扩展之后,
-x打印每一行

如果您不喜欢默认通配符行为,当通配符表达式不匹配任何内容时返回通配符本身,那么还可以考虑在bash(1)手册页中花一些时间查看诸如nullglob和的shell选项failglob

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用Glob获取目录和子目录中的图像

来自分类Dev

复制目录和子目录

来自分类Dev

解压目录和子目录中的所有.gz

来自分类Dev

使用bash terminal命令打开目录和子目录中的所有文件?

来自分类Dev

循环浏览子目录中的所有媒体文件

来自分类Dev

计算给定路径中的文件,目录和子目录

来自分类Dev

仅列出bash中目录和子目录中的文件名

来自分类Dev

批次:在每个目录和子目录中搜索目录

来自分类Dev

循环浏览子目录,用bash爆炸文件名

来自分类Dev

如何在不删除bash目录的情况下删除目录中的所有文件和子目录?

来自分类Dev

Bash脚本创建多个目录和子目录

来自分类Dev

循环通过子目录

来自分类Dev

如何在不删除bash目录的情况下删除目录中的所有文件和子目录?

来自分类Dev

Bash脚本创建多个目录和子目录

来自分类Dev

删除目录和子目录的问题

来自分类Dev

IdFTP,上传目录和子目录

来自分类Dev

使用循环在子目录中的子目录

来自分类Dev

循环浏览子目录中的所有媒体文件

来自分类Dev

Perl中的FTP上传目录和子目录

来自分类Dev

循环浏览目录及其子目录文件

来自分类Dev

使用bash创建目录和子目录?

来自分类Dev

Java中的子目录和主目录监视

来自分类Dev

bash函数替换目录和子目录中每次出现的文本

来自分类Dev

Bash - 循环子目录也包括文件

来自分类Dev

所有文件和子目录的循环 cat 命令

来自分类Dev

Bash 循环在每个子目录中创建目录

来自分类Dev

通过目录和子目录中的文件的脚本

来自分类Dev

截断和重命名目录中的子目录

来自分类Dev

创建目录和子目录崩溃