这是我的命令行:
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像素并将它们焦化为存档。
答案 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
即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 -
最终命令:
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
相同。