在Bash中创建列出每个子目录中所有文件的列表。

6
我希望您能够编写一个Bash脚本,该脚本将循环遍历所有子目录,从给定路径开始,并创建包含当前目录中所有文件的MD5摘要列表。
我需要类似于"ls -R"的东西,但是我不确定如何开始。
2个回答

7

使用find命令非常简单:

find . -type f -exec md5 {} \;

该命令会查找所有文件(-type f),并对每个文件执行md5命令(-exec md5 {} \;)。

不错,但它正在循环遍历所有文件,甚至是隐藏目录中的文件。有没有办法只循环遍历普通目录? - Maj0r
1
你可以使用 not -path "*/.*/*" 来排除以 . 开头的目录,使用 -not -name ".*" 来排除以 . 开头的文件。 - jbr
有什么理由避免使用“-exec md5 {} +”吗? - jfs
那是一个不同的问题 ;)。但是 md5 {} + 相当于 md5 文件1 文件2 文件3 ...md5 {} ; 相当于 md5 文件1; md5 文件2; md5 文件3; ... - jbr

1

还有一个叫做tree的程序,但你可以只使用shell内置命令来模拟它:

#!/bin/sh
DIR=${1:-`pwd`}
SPACING=${2:-|}
cd $DIR
for x in * ; do
    [ -d "$DIR/$x" ] &&  echo "$SPACING\`-{$x" && $0 "$DIR/$x" "$SPACING  " || \
    echo "$SPACING $x : MD5=" && md5sum "$DIR/$x"
done

请注意,它需要完整路径参数(或当前目录的无参数)。
虽然有很多方法加速它并使代码更复杂以便跟踪,但它不像find那么快,但提供树形结构的图形表示。您可以通过添加- && [ ! -L "$DIR/$x" ]来修改它以不遵循符号链接,或仅列出目录:删除|| echo $SPACING $x

这怎么回答问题呢? - Adrian Frühwirth
@AdrianFrühwirth 是的,我第一次阅读时错过了md5sum部分,但它是一个循环所有子目录的shell脚本...只需要在echo "$SPACING $x"后的文件行上添加md5sum,例如&& md5sum "$DIR/$x" ...忘记提到它也需要一个完整路径参数。 - technosaurus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接