我想要显示字节大小在 30000 到 50000 之间的目录和子目录中的所有文件。
我想按以下方式显示我的文件:
file1.xxx md5sum bytesize
file2.xxx md5sum bytesize
这是我到目前为止的代码(它必须是一个命令):
find /mnt/analysis -size +30000c -size -50000c -exec md5sum {} \; -exec ls -l {} \; | awk '{print $1 $5 $9}'
输出:
2fc863d4e42fcced35ce17cdbb9cb623
-rwxrwxrwx33673/mnt/analysis/bla/twelve.png
a952105e64609de5149db2da08e3256c
-rwxrwxrwx41412/mnt/analysis/bla/thirteen.png
期望的输出:
/mnt/analysis/bla/twelve.png 2fc863d4e42fcced35ce17cdbb9cb623 33673
/mnt/analysis/bla/thirteen.png a952105e64609de5149db2da08e3256c 41412
问题是 awk 在两个 exec 文件上完成,这就是权限也进入那里的原因。
答案1
你能先接受 md5sum 吗?
find /mnt/analysis -size +30000c -size -50000c -type f | xargs stat -c"echo \$(md5sum %n) %s" | sh
或带有减号
find /mnt/analysis -size +30000c -size -50000c -type f | xargs stat -c"echo %n \$(md5sum <%n) %s" | sh
tr -d -
(当然,如果没有文件名,您可以通过附加 来删除)
答案2
为了按照您想要的方式重新格式化内容,我会将代码包装到“find shell”中;它归结为带有三个参数的单个“printf”命令:
- 文件名
- 文件的 md5sum
- 文件的大小
该find
命令将每个匹配的文件名作为参数 ( ) 传递到“find shell”中$1
,因此这就是每个 printf 参数的作用:
find /mnt/analysis -size +30000c -size -50000c -type f -exec \
sh -c 'printf "%s %s %d\n" \
"$1" \
"$(md5sum "$1" | awk "{print \$1}")" \
"$(stat -c %s "$1")"' find-sh {} \;
我-type f
对原始 find 命令添加了限制,以便从 md5sum (以及stat
获取大小的调用)获得有意义的结果。我已将“find shell”命令分解为多行,以使其更易于阅读,但也可以折叠为一行(长)。还有一些额外的阴谋只是md5sum 命令中的 md5sum 元素;由于整个“find shell”都用单引号括起来,因此我对 awk 脚本使用了双引号,这意味着需要$
转义才能让 awk 看到$1
而不是/some/file/here
.
答案3
结合find
++wc
工具cut
:
find /mnt/analysis -type f -size +30000c -size -50000c -exec \
bash -c 's=$(wc -c < "$1"); echo "$1 $(md5sum < "$1" | cut -d" " -f1) $s"' _ '{}' \;