2016-10-02 1 views
4

.txtファイルに保存されている情報に基づいて画像を開くときに、Bashで問題が発生しました。私はサイズや高さでいくつかの画像をソートしようとしており、ソートされた順番で画像を表示しようとしていますが、同じ名前の.txtファイルのないフォルダに.jpgがある場合、 。bash - 対応するテキストファイルが存在するときにのみ画像を開く

私の状況を整理して、.jpg拡張子の.txtファイルを持つ画像だけを開く方法を見つけようとしています。

が、私は解決策がリストに(拡張子なし)すべての.JPGの名前を入れて、私のようになり、その後、リストを処理して、のようなものを実行します考え出し:

[もし-f $ファイル名.txt]。 ~~~

しかし、私はfor-loopなしで繰り返しの問題に出くわしました。そうしないと、すべての画像が何度も開くことになりました。私の試みはあった。

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

私は最初にファイルのチェックを行い、findは対応するテキストファイルを持つファイルを報告するだけです。次のスニペットは、ちょうど対応するtxtファイル持ってjpgファイルが表示されます。

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に追加されません - それは最も可能性の高い大多数のケースで失敗するiサンセリフ.jpg拡張子という名前のファイルを実行しようとするの期間自体にyを設定します。)

関連する問題