这是我的命令行:
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: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors
我想要的是在当前目录中找到所有宽度小于 1000 像素的图像并将它们压缩到存档中。
最佳答案
使用--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
你可以省去很多麻烦,因为你的最大宽度是 999 by grep
ing 为 1、2 或 3 位数字宽度,尽管 awk '$1<1000'
如果您想使用不同的阈值,最终会更好:
find . -type f -iname "*.png" -or -iname "*.jpg" -print0 |
xargs -0 file |
grep ', [0-9][0-9]\?[0-9]\? x '
grep
和 awk
比 sed
快,因此请尽可能使用它们:
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 -
关于linux - 使用 sed 输出的特定文件列表在 linux 上创建 tar gz,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41403831/