[英]bash to print certain file names to text
過去幾周我花了很多時間在這里發帖。 最后,我認為我與bash的學習更加緊密,但是我的代碼存在一個問題,我一生無法解決為什么它無法運行的問題。 我可以在終端中運行每一行,它返回一個結果,但是由於某種原因,當我將其指向運行時,它什么也沒做。 我收到一個語法錯誤:單詞意外(期望“做”)。
#!/bin/bash
image="/Home/Desktop/epubs/images"
for f in $(ls "$image"*.jpg); do
fsize=$(stat --printf= '%s' "$f");
if [ "$fsize" -eq "40318" ]; then
echo "$(basename $f)" >> results.txt
fi
done
我想念什么???
問題可能出在行尾。 確保您的腳本文件具有unix行結尾,而不是Windows。
同樣,不要迭代ls
輸出。 在外殼中使用globing:
for f in "$file"/*.jpg ; do
這就是我要做的。
#!/bin/bash -e
image="/Home/Desktop/epubs/images"
(cd "$image"
for f in *.jpg; do
let fsize=$(stat -c %s "$f")
if (( fsize == 40318 )); then
echo "$f"
fi
done) >results.txt
-e
表示如果出現任何問題(例如,無法cd進入目錄),腳本將退出。 對這種行為感到滿意時,可以節省很多錯誤檢查。
括號表示cd
命令位於子外殼中; 周圍的腳本(包括重定向到results.txt
)仍然位於您開始的任何目錄中。
現在我們位於目錄中,我們只需查找*.jpg
,無需目錄前綴,也無需在任何basename
上調用basename
。
使用let
和(( == ))
會將大小值視為數字而不是字符串,因此我們不會因stat
選擇格式化值的方式而感到困惑。
我們只將整個循環的輸出重定向到結果文件中,而不是每次都追加。 效率更高。 如果要保留results.txt
中的現有內容,則可以將>
改回>>
,但是將其保留在整個循環中仍然比打開文件並在每次迭代時附加到文件中更有效。
您的for循環似乎缺少要迭代的值列表:
image="/Home/Desktop/epubs/images"
for f in $(ls "$image"*.jpg); do
因為$image
不以/結尾,所以您的ls
命令擴展為
for f in $(ls /Home/Desktop/epubs/images*.jpg); do
這可能導致
for f in ; do
導致語法錯誤。 最簡單的解決方法是
for f in $(ls "$image"/*.jpg); do
但是您應該在其他答案中采納建議,然后跳過ls
:
for f in "$image"/*.jpg; do
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.