2011-01-26 16 views
1

私は現在、小さなかわいいシェルスクリプトを使って特定のフォルダをループし、その中のファイルのみを出力します。残念ながら、私はファイル名変数にアクセスする必要があるので、findを使用することはできません。シェルスクリプト:ファイルがディレクトリではなくファイルであることを確認してください。

は、ここでは動作しません。私の現在のスニペット、です:私は間違って

for filename in "/var/myfolder/*" 
do 
    if [ -f "$filename" ]; then 
    echo $filename # Is file! 
    fi 

done; 

何をしているのですか?周りには/ var/myfolderなど/ *(理由ビーイング二重引用符を置くことによってあなたの代わりに、それぞれの単一の文字列を別の文字列

答えて

4

あなたは逃げられない必要がありますファイル名のすべてのファイルを作っているということは/ var、二重引用符なし

1

てみてください/ myfolderなど/ *、意味、あなたは正しくファイル名の希望リストにシェルによって展開されるように発現のためのために、二重引用符を削除する必要があります。

+0

いいえ、すべてのファイルが*単一の文字列ではありません。これはアスタリスクをリテラルにし、globを展開しません。 –

+0

あなたは正しいです、それはリテラルアスタリスクで、 "echo $ filename"で展開されます – vmpstr

1

for filename in "/var/myfolder/*"

を引用符を使用すると、1つの巨大なを取得する意味しますそのグロブからの文字列 - echo _ $filename _をの直前に貼り付けますは、 'ループ'を1回しか通過しないことを発見し、有用でないものを探します。

findを使用していない何が間違ってやっている引用符を削除して再試行してください:)

+0

引用符で囲まれた塊ではありません。アスタリスクはリテラルです。 –

+0

@Dennis Williamson、訂正してくれてありがとう。 'echo'はシェルが割り当て前にアスタリスクを展開していたディレクトリの内容全体を出力したためと思いました。 'echo'を実行するときにシェルがアスタリスクを拡張することに気づいていませんでした.-私の仮定を修正することに感謝します。 :) – sarnold

2

を。ファイル名は{}を使用して取得できます。

find /var/myfolder -maxdepth 1 -type f -exec echo {} \; 
-1

これらの問題をすべて発見して回避することができます。

for i in $(find /var/myfolder -type f) 
do 
echo $(basename $i) 
done 

これはあなたの状況でやっていることではありませんか?深さを制限する場合は、-maxdepthオプションを使用して検索してください。

+1

スペースを含むファイル名があれば、そのように 'for'と' find'を使うと失敗します。 'find -exec'または' find -print0 | 'を使ってください。 xargs -0'または 'find | IFS = $ '\ n'を読んでいますか?IFS = $ '\ n'を読んでいます-r ... done <<(発見) 'です。 –

+0

デニスに感謝します。非常に有効なポイント。 –

関連する問題