2017-05-16 3 views
3

私はこの問題が何であるか完全に理解しています。ワイルドカードを使用せずにunixのディレクトリの内容を反復処理するにはどうすればよいですか?

私は、 'cat.jpg'と 'dog.jpg'の先頭にファイルがあります。 「cat.jpg」ファイルを「cat」というディレクトリに移動したいだけです。 'dog.jpg'ファイルと同じです。大丈夫です

mv: cannot stat '*.jpg': No such file or directory

for f in *.jpg; do 
    name=`echo "$f"|sed 's/ -.*//'` 
    firstThreeLetters=`echo "$name"|cut -c 1-3` 
    dir="path/$firstThreeLetters" 
    mv "$f" "$dir" 
done 

私はこのメッセージが表示されます。しかし、私はそのワイルドカードを使用せずにこれらの画像を反復処理する方法を見つけることができません。

私はワイルドカードを使用したくありません。唯一のファイルには「犬」または「猫」が付いています。私は一致する必要はありません。すべてのファイルは.jpgです。

ワイルドカードを使用せずにディレクトリの内容を繰り返し処理することはできませんか?私はこれがXY問題のビットであることを知っていますが、まだ私はこれを学びたいと思います。

+0

このエラーメッセージは、現在のディレクトリに.jpgファイルがないことを示しています。このスクリプトを実行すると正しいディレクトリにいますか? –

答えて

3

*.jpgは一致するファイルがない場合には*.jpgとなります。 nullglobが必要なようです。

#!/bin/bash 

shopt -s nullglob    # makes glob expand to nothing in case there are no matching files 
for f in cat*.jpg dog*.jpg; do # pick only cat & dog files 
    first3=${f:0:3}    # grab first 3 characters of filename 
    [[ -d "$first3" ]] || continue # skip if there is no such dir 
    mv "$f" "$first3/$f"   # move 
done 
+0

"あなたの問題はワイルドカードではなく、包括的すぎるという事実です。"どうして?私が持っているのはディレクトリ内のjpgです。隠されたファイルはありません...私は何を含んでいますか? –

+0

'* .jpg'は' cat'や 'dog'で始まるものだけを望む間にすべてのjpgファイルにマッチします。 – codeforester

+0

私にとって幸いなことに、ディレクトリ内の唯一のファイルには「dog」または「cat」が付いています。私は一致する必要はありません...すべてのファイルは.jpgです!これは問題ではありません。私は、問題は 'mv" $ f "" $ dir "'に行く時までにワイルドカード記号を使うことと関係していると思います –

関連する問題