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

时间:2016-12-30 23:10:18

标签: linux bash unix sed tar

这是我的命令行:

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

我得到的错误是:

  

tar:Unix \ n./test.png \ n./test2.jpg \ n:无法统计:没有此类文件或   目录
  tar:由于先前的错误而退出失败状态

我想要的是找到当前目录中的所有图像,宽度小于1000像素并将它们焦化为存档。

3 个答案:

答案 0 :(得分:5)

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

...
| tr '\n' '\0' \
| tar -czvf images.tar.gz --null -T -

(测试,工作。)

此外,以下是关于速度和风格的一些建议,按重要性递减顺序。

一个。找不到更多文件并运行file,而不是:

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

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

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

℃。如果您将|放在每一行的末尾,则可以继续使用\而不使用find . -type f -iname "*.png" -or -iname "*.jpg" -print0 | xargs -0 file

grep

d。你可以省去很多麻烦,因为你的最大宽度为999,仅awk '$1<1000'为1,2或3位宽,但find . -type f -iname "*.png" -or -iname "*.jpg" -print0 | xargs -0 file | grep ', [0-9][0-9]\?[0-9]\? x ' 最终会更好,以防你想要使用不同的门槛:

grep

awksed的速度比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' '\0' |
  tar -czvf images.tar.gz --null -T -

最终命令:

localhost:4200

答案 1 :(得分:2)

您也可以仅使用awk

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

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

可以使用width_limit变量

配置宽度

答案 2 :(得分:1)

使用perl的快捷方式:

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

+运算符用于find,效果与print0 | xargs -0相同。