0

为了检查一些恢复的数据,我正在编写一个脚本,该脚本递归地遍历文件夹和文件并最终在它们上运行文件,以检查它们是否可能从某个备份中完全恢复。(恢复的文件播放,并被识别为 mp3 或其他音频,非工作文件为 ASCII-Text)

现在我只要让它检查我的测试文件夹结构,打印所有文件夹和相应的文件就很满意了。(打印它们主要是为了测试,也因为我想记录脚本当前在哪里以及它到底走了多远,以验证已经处理了什么)

我尝试使用 2 个 for 循环,一个用于文件夹,一个用于文件。(因此理想情况下它需要 1 个文件夹,然后列出其中的文件(或可能深入到子文件夹),并且在每个文件夹下面只给出该子文件夹中的文件,然后继续下一个。例如:

Folder1  
- File 1  
- File 2  
    -- Subfolder  
    -- File3  
    -- File4  
Folder2  
- File5  

但是,这似乎不适用于通常建议的方式(例如 for 循环)。我尽可能使用“find . -type d”作为目录和“find .-type f”或“find * -type f”(这样它就不会进入子目录)但是,当只是打印路径/文件以检查它是否按照我的意愿运行,很明显这不起作用。

它似乎总是首先打印所有目录(第一个循环),然后是所有文件(第二个循环)。为了跟踪它正在做什么并更容易知道检查/恢复了什么,我想以更有序的方式执行此操作,如上所述。那么是我做错了什么,还是这可能是 bash 中 for 循环的一般限制?

另一个可能相关的问题:虽然将 find 的输出分配给数组似乎可行,但它不能作为数组访问......

循环示例:
for folder in '$(find . -type d)' ; 做
echo $folder
让文件夹计数器 ++
完成

Arrays:folders=("$(find . -type d)")
#据我所知,这应该将输出分配为数组
#但是,它并没有以某种方式正确分配为
echo "$folders[1]"
#不起作用(空格所需的引号)

4

2 回答 2

1

@H.-Dirk Schmitt 所指的find ... -exec ...解决方案可能类似于:

find . -type f -exec sh -c '
    case $(file "$1") in
    *Audio file*)
        echo "$1 is an audio file"
        ;;
    *ASCII text*)
        echo "$1 is an ascii text file"
        ;;
    esac
' _ {} ';'
于 2013-03-10T21:31:11.467 回答
1

为了检查一些恢复的数据,我正在编写一个脚本,该脚本递归地遍历文件夹和文件并最终在它们上运行文件,以检查它们是否可能从某个备份中完全恢复。(恢复的文件播放,并被识别为 mp3 或其他音频,非工作文件为 ASCII-Text)

如果你想file在当前目录中的每个文件和目录上运行,包括它的子目录等等,你不需要使用 Bash for-loop,因为你可以告诉find运行file

find -exec file '{}' ';'

(该-exec ... ';'选项...在每个匹配的文件或目录上运行命令,将参数替换为{}文件的路径。)

如果您只想file在常规文件(而不是目录)上运行,您可以指定-type f

find -type f -exec file '{}' ';'

如果您(例如)只想打印目录的名称,但在常规文件上运行上述内容,则可以使用-or运算符连接一个使用的指令-type d和一个使用的指令-type f

find -type d -print -or -type f -exec file '{}' ';'

编辑补充:如果需要,可以在纯Bash中(file当然是加上命令),通过编写递归shell函数来实现上述命令的效果。例如:

function foo () {
    local file
    for file in "$1"/* ; do
        if [[ -d "$file" ]] ; then
            echo "$file"
            foo "$file"
        else
            file "$file"
        fi
    done
}
foo .

这与find命令的不同之处在于它将更一致地对文件进行排序,并且可能在诸如处理点文件和符号链接之类的坚韧细节上,但大致相同,因此可以用作进一步调整的起点。

于 2013-03-10T21:24:22.220 回答