使用 sed 输出的特定文件列表在 linux 上创建 tar gz
Create tar gz on linux with specific list of files from sed output
这是我的命令行:
find . -type f -exec file {} \; \
| sed 's/\(.*png\): .* \([0-9]* x [0-9]*\).*/ /' \
| sed 's/\(.*jpg\): .* \([0-9]*x[0-9]*\).*/ /' \
| awk 'int() < 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 像素的图像并且 tar 将它们归档。
要使用--null
,您需要先将换行符转换为空值:
...
| tr '\n' '[=10=]' \
| tar -czvf images.tar.gz --null -T -
(已测试,有效。)
另外,这里有一些关于速度和风格的建议,按重要性从高到低排列。
一个。没有找到和 运行 file
超过你需要的文件:
find . -type f -iname "*.png" -or -iname "*.jpg"
b。对于每个命令可以 运行 多个文件的命令,例如 file
,使用 xargs
可以节省大量时间:
find . -type f -iname "*.png" -or -iname "*.jpg" -print0 | xargs -0 file
c。如果你把 |
放在每行的末尾,你可以在下一行继续而不用 \
.
find . -type f -iname "*.png" -or -iname "*.jpg" -print0 |
xargs -0 file
d。你可以为自己省去很多麻烦,因为你的最大宽度是 999,只需 grep
ing 1、2 或 3 位数字宽度,尽管 awk '<1000'
最终更好,以防你想使用不同的阈值:
find . -type f -iname "*.png" -or -iname "*.jpg" -print0 |
xargs -0 file |
grep ', [0-9][0-9]\?[0-9]\? x '
e。 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' '[=16=]' |
tar -czvf images.tar.gz --null -T -
使用perl
的快捷方式:
find . -type f -exec file {} + |
perl -ne '
print ."[=10=]" if /^(.*):\s*(JPEG|PNG).*,\s*(\d+)\s+x\s*\d+\s*,/ &&
< 1000;
' | tar -czvf images.tar.gz --null -T -
使用 +
运算符 find
与 print0 | xargs -0
.
的效果相同
您也可以仅将 awk
用于:
find . -type f \( -name "*.png" -or -name "*.jpg" \) -exec file {} \; | awk -v width_limit=1000 '
{
match([=10=], /,\s+([0-9]+)\s*x\s*([0-9]+)/, items)
if (items[1] < width_limit){
match([=10=], /(.*):/, filename)
print filename[1]
}
}' | tar -czvf allfiles.tar -T -
宽度可以用width_limit
变量配置
这是我的命令行:
find . -type f -exec file {} \; \
| sed 's/\(.*png\): .* \([0-9]* x [0-9]*\).*/ /' \
| sed 's/\(.*jpg\): .* \([0-9]*x[0-9]*\).*/ /' \
| awk 'int() < 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 像素的图像并且 tar 将它们归档。
要使用--null
,您需要先将换行符转换为空值:
...
| tr '\n' '[=10=]' \
| tar -czvf images.tar.gz --null -T -
(已测试,有效。)
另外,这里有一些关于速度和风格的建议,按重要性从高到低排列。
一个。没有找到和 运行 file
超过你需要的文件:
find . -type f -iname "*.png" -or -iname "*.jpg"
b。对于每个命令可以 运行 多个文件的命令,例如 file
,使用 xargs
可以节省大量时间:
find . -type f -iname "*.png" -or -iname "*.jpg" -print0 | xargs -0 file
c。如果你把 |
放在每行的末尾,你可以在下一行继续而不用 \
.
find . -type f -iname "*.png" -or -iname "*.jpg" -print0 |
xargs -0 file
d。你可以为自己省去很多麻烦,因为你的最大宽度是 999,只需 grep
ing 1、2 或 3 位数字宽度,尽管 awk '<1000'
最终更好,以防你想使用不同的阈值:
find . -type f -iname "*.png" -or -iname "*.jpg" -print0 |
xargs -0 file |
grep ', [0-9][0-9]\?[0-9]\? x '
e。 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' '[=16=]' |
tar -czvf images.tar.gz --null -T -
使用perl
的快捷方式:
find . -type f -exec file {} + |
perl -ne '
print ."[=10=]" if /^(.*):\s*(JPEG|PNG).*,\s*(\d+)\s+x\s*\d+\s*,/ &&
< 1000;
' | tar -czvf images.tar.gz --null -T -
使用 +
运算符 find
与 print0 | xargs -0
.
您也可以仅将 awk
用于:
find . -type f \( -name "*.png" -or -name "*.jpg" \) -exec file {} \; | awk -v width_limit=1000 '
{
match([=10=], /,\s+([0-9]+)\s*x\s*([0-9]+)/, items)
if (items[1] < width_limit){
match([=10=], /(.*):/, filename)
print filename[1]
}
}' | tar -czvf allfiles.tar -T -
宽度可以用width_limit
变量配置