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

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像素并将它们焦化到存档中.

web*_*ebb 5

要使用--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)