查找+粘贴+查找:对每个文件进行多次查询

查找+粘贴+查找:对每个文件进行多次查询

我试图为目录中的每个文件获取至少包含以下字段的一行(顺序无关紧要,尽管顺序是更好的):

 - Image resolution, in case it is an image. If not, just blank.
 - Modification date
 - Human readable file size
 - Filename

目录中的文件是jpg图像,其余的只是纯文本文件。我尝试过类似的事情:

find . -type f -exec paste `identify {} 2> /dev/null` `ls -goh {}` \;

ls告诉我cannot access {}2> /dev/null里面的部分用于identify跳过非 jpg 文件的错误消息。

我也尝试过不同的组合xargs等等$(),但还没有找到方法。

有什么建议吗?

答案1

这看起来对于嵌入式-exec脚本来说是一个很好的用途:

find . -name \*.png -exec sh -c 'printf '%s,%s\\\\n' "$(identify -format '%hx%w' "$1")" "$(stat -c %y,%s,%n "$1")";' bash {} \; > out.csv

示例输出为:

32x32,2018-09-21 15:04:33.216773000 -0400,192,./favicon.png
20x20,2018-09-21 15:04:33.225771000 -0400,1202,./delete.png

为了便于阅读,该脚本被分解为:

find . -name \*.png -exec sh -c 
  'printf '%s,%s\\\\n' 
     "$(identify -format '%hx%w' "$1")" 
     "$(stat -c %y,%s,%n "$1")";' 
  bash {} \; > out.csv

请注意额外的引号以将单个内容\n放入printf.

在 之外find,要获取当前目录中文件的此类输出:

for f in ./*.png
do
  printf '%s,%s\n' "$(identify -format '%hx%w' "$f")" "$(stat -c %y,%s,%n "$f")"
done

示例输出为:

20x20,2018-09-21 15:04:33.225771000 -0400,1202,./delete.png
32x32,2018-09-21 15:04:33.216773000 -0400,192,./favicon.png

您可以根据需要更换这些部件或添加其他部件;对于第三个命令,只需添加另一个%s并引用的命令。

我生成了一个简单的 CSV 类型输出,但如果您的文件名可能包含逗号,您应该引用文件名。如果将文件大小从简单的字节字符串转换为在数千位中带有逗号的文件大小,情况也是如此。

答案2

在查找开始之前,替换中的文本会被评估一次。请注意,首选方式是 now $( )。您可以将引用的命令传递给 shell,但最简单的方法是创建一个脚本并从find.

相关内容