簡體   English   中英

bash將某些文件名打印為文本

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM