介紹
假設我有這個檔案夾結構
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
我目前被困在這個嘗試中:
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
上面的腳本產生:
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 _ :
題
如何修復腳本以便它以正確的格式產生正確的結果?
uj5u.com熱心網友回復:
xargs -I_ echo 'function getimgsize ()...
呃,好糾結。如果您發現自己處于這種情況,并且您正在使用 Bash,則意味著出現問題。只需撰寫函式并將其匯出即可。
getimgsize() {
stuff to do with "$1"
srcimg="$1"
}
export -f getimgsize
input | xargs -n1 bash -c 'getimgsize "$@"' _
不要用單引號撰寫復雜的代碼。使用 shellcheck 檢查常見錯誤。不要使用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這里使用真的有任何價值嗎?回圈一下就行了
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
uj5u.com熱心網友回復:
我有一個與此類似的腳本,用于比較不同的壓縮格式。這是一個簡短的改編:
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
好像:
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
如果相應的檔案不存在,它會列印一個破折號。您可以更改分隔符等。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/356294.html
上一篇:根據用戶輸入重復bash腳本
