使用 sed 输出的特定文件列表在 linux 上创建 tar gz

Create tar gz on linux with specific list of files from sed output

这是我的命令行:

find . -type f -exec file {} \; \
| sed 's/\(.*png\): .* \([0-9]* x [0-9]*\).*/ /' \
| sed 's/\(.*jpg\): .* \([0-9]*x[0-9]*\).*/ /' \
| awk 'int() < 1000' \
| sed 's/^.*[[:blank:]]//' \
| tar -czvf images.tar.gz --null -T -

我得到的错误是:

tar: Unix\n./test.png\n./test2.jpg\n: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors

我想要的是在当前目录中找到所有宽度小于 1000 像素的图像并且 tar 将它们归档。

要使用--null,您需要先将换行符转换为空值:

...
| tr '\n' '[=10=]' \
| tar -czvf images.tar.gz --null -T -

(已测试,有效。)

另外,这里有一些关于速度和风格的建议,按重要性从高到低排列。

一个。没有找到和 运行 file 超过你需要的文件:

find . -type f -iname "*.png" -or -iname "*.jpg"

b。对于每个命令可以 运行 多个文件的命令,例如 file,使用 xargs 可以节省大量时间:

find . -type f -iname "*.png" -or -iname "*.jpg" -print0 | xargs -0 file

c。如果你把 | 放在每行的末尾,你可以在下一行继续而不用 \.

find . -type f -iname "*.png" -or -iname "*.jpg" -print0 |
  xargs -0 file

d。你可以为自己省去很多麻烦,因为你的最大宽度是 999,只需 greping 1、2 或 3 位数字宽度,尽管 awk '<1000' 最终更好,以防你想使用不同的阈值:

find . -type f -iname "*.png" -or -iname "*.jpg" -print0 |
  xargs -0 file |
  grep ', [0-9][0-9]\?[0-9]\? x '

e。 grepawksed 快,所以尽可能使用它们:

find . -type f -iname "*.png" -or -iname "*.jpg" -print0 |
  xargs -0 file |
  grep ', [0-9][0-9]\?[0-9]\? x ' |
  grep -o -i '.*\.\(png\|jpg\)'

最终命令:

find . -type f -iname "*.png" -or -iname "*.jpg" -print0 |
  xargs -0 file |
  grep ', [0-9][0-9]\?[0-9]\? x ' |
  grep -o -i '.*\.\(png\|jpg\)' |
  tr '\n' '[=16=]' |
  tar -czvf images.tar.gz --null -T -

使用perl的快捷方式:

find . -type f -exec file {} + |
    perl -ne '
        print ."[=10=]" if /^(.*):\s*(JPEG|PNG).*,\s*(\d+)\s+x\s*\d+\s*,/ &&
              < 1000;
        ' | tar -czvf images.tar.gz --null -T -

使用 + 运算符 findprint0 | xargs -0.

的效果相同

您也可以仅将 awk 用于:

find . -type f \( -name "*.png" -or -name "*.jpg" \)  -exec file {} \; | awk -v width_limit=1000 '
    {
        match([=10=], /,\s+([0-9]+)\s*x\s*([0-9]+)/, items)

        if (items[1] < width_limit){
            match([=10=], /(.*):/, filename)
            print filename[1]
        }             
    }' | tar -czvf allfiles.tar -T -

宽度可以用width_limit变量配置