2016-10-02 54 views
4

當我嘗試僅根據存儲在有關它們的.txt文件中的信息嘗試打開圖像時,我遇到了Bash中的問題。我試圖按照大小或高度對許多圖像進行排序,並按排序順序顯示圖像,但如果文件夾中沒有帶相同名稱的.txt文件的.jpg文件,則不應對其進行處理。bash - 僅當存在相應的文本文件時纔打開圖像

我有我的情況完成的排序片,並試圖找出我將如何去打開只有.jpg文件擴展名爲.txt文件的圖像。

我想出一個解決方案看起來像我在一個目錄,將每一個.JPG的名稱(不包括擴展名),然後在列表中處理和運行是這樣的:

[-f如果$ FILENAME.TXT]。然後~~~

但我遇到了沒有for循環迭代的問題,否則所有的圖片將打開多次。我的嘗試是:

for i in *jpg; do 
y=$y ${i.jpg} 
done 
if[ -f $y.txt ] then 
(sorting parts) 

這隻能看着y中的最後一個文件名,因爲它應該,但我想,如果存在找出一種方式來看待每一個單獨的文件名,並看到文本文件,爲了將其包括在分類中。

非常感謝您的幫助!

+0

您是否嘗試過在if語句中使用'&&'操作符? –

+0

@ user556068是的,查看名稱和.txt是否都以文件形式存在,但我不知道如何處理列表中的每一個而不是最後一個。感謝您的答覆! – Jillian

+0

你能否澄清一下這個問題,目前還不清楚你想要什麼,可能是一個好主意,增加你提到的排序。您已經展示了一種檢查文件存在的方法,它是標題中問題的解決方案。 –

回答

0

我會先做文件檢查,以便只找到具有相應文本文件的報告文件。下面的代碼片段將只顯示jpg中具有相應txt文件中的文件:

find . -name "*.jpg" -maxdepth 1 -exec /bin/bash -c '[ -e "${0%.*}.txt" ] && echo "$0";' {} \; 
+2

這看起來像一個巨大的[無用的'echo'](http://www.iki.fi/era/unix/award.html#echo)。如果你擺脫了外部'echo'和命令替換,你也可以擺脫'grep',這將不再是必要或有用的。 – tripleee

+0

@tripleee:是的,你是對的 - 我改變了上面的代碼片段。 – Julian

+0

'find'也會遍歷子目錄,這在需求中沒有提到。也許添加'-maxdepth 1'來禁用它,也許刪除多餘的通配符。 – tripleee

1

在單個變量採集的文件名列表是一個反模式。你想要將它們收集在一個數組中。

a=() 
for f in *.jpg; do 
    if [ -e "${f%.jpg}".txt ]; then 
     continue 
    fi 
    a+=("$f") 
done 
# now do things with "${a[@]}" 

通常情況下,你並不真的需要收集在一個數組中的文件 - 只要你在做for循環內,以每個單獨的文件的一切,你遍歷文件。

(實際上y=$y ${i%.jpg}不追加到y - 它設置y它自身試圖執行一個名爲i SAN的.jpg擴展文件,這在絕大多數情況下,最有可能失敗的持續時間。)

相關問題