如何递归遍历目录树并只查找文件?

时间:2017-01-23 05:46:37

标签: bash file directory

我正在进行scp调用,以下载远程系统上的文件夹。下载的文件夹有子文件夹,在这些子文件夹中有一堆文件我想作为参数传递给python脚本,如下所示:

scp -r researcher@192.168.150.4:SomeName/SomeNameElse/$folder_name/ $folder_name/
echo "File downloaded successfully"
echo "Running BD scanner"
for d in $folder_name/*; do
        if [[ -d $d ]]; then
                echo "It is a directory"
        elif [[ -f $d ]]; then
                echo "It is a file"
                echo "Running the scanner :"
                 python bd_scanner_new.py /home/nsadmin/Some/bash_script_run_files/$d
        else
                echo "$d is invalid file"
                exit 1
        fi
done

我添加了逻辑以查找是否有任何目录并将其排除。但是,我不会递归地遍历这些目录。

以下部分结果:

File downloaded succesfully
Running BD scanner
It is a directory
It is a directory
It is a directory
Exiting

我想改进这段代码,以便遍历所有目录并获取所有文件。请帮我提出任何建议。

2 个答案:

答案 0 :(得分:2)

您可以在Bash 4.0 +中使用shopt -s globstar

#!/bin/bash

shopt -s globstar nullglob
cd _your_base_dir
for file in **/*; do
  # will loop for all the regular files across the entire tree
  # files with white spaces or other special characters are gracefully handled
  python bd_scanner_new.py "$file"
done

Bash手册说明globstar

  

如果设置,文件名扩展上下文中使用的模式“**”将   匹配所有文件和零个或多个目录和子目录。如果   该模式后跟一个'/',只有目录和子目录   匹配。

此处有更多globstar讨论:https://unix.stackexchange.com/questions/117826/bash-globstar-matching

答案 1 :(得分:1)

为什么要通过使用globbing进行文件匹配,而不是使用find来解决这个问题,方法是使用带有while循环的进程替换(<())。

#!/bin/bash

while IFS= read -r -d '' file; do
    # single filename is in $file
    python bd_scanner_new.py "$file"
done < <(find "$folder_name" -type f -print0)

这里,find递归搜索从上述路径到下面任何级别的子目录的所有文件。文件名可以包含空格,制表符,空格,换行符。要以安全的方式处理文件名,请使用-print0查找:使用所有控制字符打印文件名&amp;以NUL终止,然后read命令进程具有相同的去限制字符。

请注意;在旁注中,始终在bash中双引号变量以避免shell扩展。