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

标签 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: 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 '

grepawksed 快,因此请尽可能使用它们:

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/

相关文章:

linux - 为什么 "at"命令总是警告我命令将通过 sh 执行?

linux - 错误 : "grep: Argument list too long"

c++ - 文件夹不存在则创建,存在则不做任何操作

linux - 应用程序启动器和输入应用程序名称并从终端运行它有什么区别?

java - 从 java 运行可执行文件失败

c - 强制 GCC 忽略某些标志?

shell - 如何注释掉 shell 脚本中的特定行

c++ - 套接字编程 : Struct sockaddr VS struct sockaddr_in

linux - 如何从 panic 中定位错误

bash - 如何将 bash 变量作为 awk 参数的值传递?