格式化目录和子目录中所有文件的显示

格式化目录和子目录中所有文件的显示

我想要显示字节大小在 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”命令:

  1. 文件名
  2. 文件的 md5sum
  3. 文件的大小

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"' _ '{}' \;

相关内容