首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法为stat命令展开xargs占位符

无法为stat命令展开xargs占位符
EN

Stack Overflow用户
提问于 2021-11-11 21:46:17
回答 2查看 163关注 0票数 0

Intro

假设我有这个文件夹结构

代码语言:javascript
复制
images/
  image1.png
  image1.webp
  image1.avif
  image2.jpg
  image2.webp
  image2.avif

我想遍历每一张图片,并以以下格式显示其各自的大小:

images/image1.png: 12333 | webp: 6300 | avif: 3400

images/image2.jpg: 15983 | webp: 8497 | avif: 1248

我目前被困在这一尝试中:

代码语言:javascript
复制
find -E images -regex ".*\.(png|jpg)" | xargs -I_ echo 'function getimgsize () { echo $(stat -c "%s" "$1"); }; srcimg="_"; srcimgnoext=$(echo "$srcimg" | sed -E "s/.jpg|.png//g"); srcimgsize=$(getimgsize "$srcimg"); webpsize=$(getimgsize "$srcimgnoext.webp"); avifsize=$(getimgsize $srcimgnoext.avif); echo "$srcimg: $srcimgsize | webp: $webpsize | avif: $avifsize"' | sh

上面的脚本产生了:

代码语言:javascript
复制
stat: cannot stat '_': No such file or directory
stat: cannot stat '_.webp': No such file or directory
stat: cannot stat '_.avif': No such file or directory
stat: cannot stat '': No such file or directory
stat: cannot stat '_': No such file or directory
stat: cannot stat '_.webp': No such file or directory
stat: cannot stat '_.avif': No such file or directory
_ :
function getstat () { echo ; }; srcimg=_; srcimgnoext=_; srcimgsize=; webpsize=; avifsize=; echo _ :

问题

如何修复脚本,使其以正确的格式生成正确的结果?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-11-11 22:14:44

xargs -I_ echo的函数getimgsize ()

啊,太纠结了。如果你发现自己在这样的情况下,你正在使用Bash,这意味着有什么不对劲。只需编写函数并导出它。

代码语言:javascript
复制
getimgsize() {
    stuff to do with "$1"
    srcimg="$1"
}
export -f getimgsize
input | xargs -n1 bash -c 'getimgsize "$@"' _

不要用单引号写复杂的代码。使用外壳检查检查常见错误。不要使用function name() --只有name()xargs stuff | sh看起来很奇怪,我认为xargs sh -c 'stuff'是最受欢迎的。不要在字符串xargs -I {} sh -c 'echo {}'中传递参数--更喜欢使用位置参数xargs -I {} sh -c 'echo "$1"' - {}。不要使用echo $(stuff)。只有stuff,它已经输出了。

在这里使用xargs真的有什么价值吗?把它循环起来。

代码语言:javascript
复制
getimgsize () { stat -c "%s" "$1"; }
find -E images -regex '.*\.(png|jpg)' |
while IFS= read -r srcimg; do
    srcimgnoext=$(<<<"$srcimg" sed -E 's/\.(jpg|png)$//')
    srcimgsize=$(getimgsize "$srcimg")
    webpsize=$(getimgsize "$srcimgnoext.webp")
    avifsize=$(getimgsize "$srcimgnoext.avif")
    echo "$srcimg: $srcimgsize | webp: $webpsize | avif: $avifsize"
done
票数 1
EN

Stack Overflow用户

发布于 2021-11-12 03:14:49

我有一个类似于此的脚本,用于比较不同的压缩格式。以下是一个简短的改编:

代码语言:javascript
复制
find . -mindepth 1 -maxdepth 1 -type f \
\( -name '*.png' -o -name '*.jpg' \) -print0 |
while IFS= read -rd '' file; do
    file=${file#./}
    name=${file%.*} ext=.${file##*.}
    list=$name

    for i in "$ext" .webp .avif; do
        size=$([[ -e "$name$i" ]] && stat -c %s "./$name$i")
        list+="$i: ${size:--} | "
    done

    echo "${list% | }"
done |
column -t |
sort -k1,1

看上去:

代码语言:javascript
复制
dragon.jpg:  111626  |  .webp:  -       |  .avif:  -
foo1.png:    20088   |  .webp:  5000    |  .avif:  295040
foo2.png:    12254   |  .webp:  13320   |  .avif:  74036
foo3.png:    19600   |  .webp:  -       |  .avif:  101388
foo4.png:    160800  |  .webp:  353883  |  .avif:  25792
foo5.png:    397100  |  .webp:  325920  |  .avif:  59249

如果不存在相应的文件,它会打印一个破折号。您可以更改分隔符等。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69935307

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档