Pay*_*ord 1 unix linux bash 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 -
Run Code Online (Sandbox Code Playgroud)
而我得到的错误是:
tar:Unix \n./test.png \n./test2.jpg \n:无法统计:没有这样的文件或目录
tar:由于先前的错误而退出失败状态
我想要的是找到当前目录中的所有图像,其宽度小于1000像素并将它们焦化到存档中.
要使用--null,您需要先将换行符转换为空值:
...
| tr '\n' '\0' \
| tar -czvf images.tar.gz --null -T -
Run Code Online (Sandbox Code Playgroud)
(经过测试,工作.)
此外,这里有一些关于速度和风格的建议,按重要性降序排列.
一个.找不到并运行file比您需要的更多文件:
find . -type f -iname "*.png" -or -iname "*.jpg"
Run Code Online (Sandbox Code Playgroud)
湾 对于可以在每个命令上运行多个文件的命令,例如file,用于xargs节省大量时间:
find . -type f -iname "*.png" -or -iname "*.jpg" -print0 | xargs -0 file
Run Code Online (Sandbox Code Playgroud)
C.如果你放在|每一行的末尾,你可以继续下一行而不使用\.
find . -type f -iname "*.png" -or -iname "*.jpg" -print0 |
xargs -0 file
Run Code Online (Sandbox Code Playgroud)
d.你可以省去很多麻烦,因为你的最大宽度是999,只grep需要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 '
Run Code Online (Sandbox Code Playgroud)
即 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\)'
Run Code Online (Sandbox Code Playgroud)
最终命令:
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 -
Run Code Online (Sandbox Code Playgroud)