web-dev-qa-db-ja.com

ディレクトリのコンテンツを反復処理する適切な方法

ディレクトリ内のすべてのファイルを反復処理する必要があります。私が見た一般的な方法の1つは、for file in *; doで始まるforループを使用することでした。ただし、隠しファイル(「。」で始まるファイル)は含まれていないことに気付きました。他の明白な方法は次のようなことです

for file in `ls -a`; do

ただし、lsを繰り返し処理することはお勧めできません。ファイル名にスペースがあると、すべてが混乱するためです。ディレクトリを反復処理してすべての隠しファイルを取得する適切な方法は何でしょうか?

15
stack smasher

スペースで区切られたグロブ一致ファイルのリストを作成するだけです:

for file in .* *; do echo "$file"; done

編集

上記のものはブレース展開を使用して別の形式で書き換えることができます

 for file in {.*,*}; do echo "$file"; done

またはさらに短い:for file in {.,}*; do echo "$file"; done

選択したファイルのパスを追加します。

 for file in /path/{..?,.[!.],}*; do echo "$file"; done

選択したファイルのパスを追加:

 for file in /path/{.,}*; do echo "$file"; done

洗練され、リストから通常は不要な.および..を削除する場合は、{.,}*{..?,.[!.],}*に変更するだけです。

完全を期すために、ドットファイルを純粋な*と一致するようにdotglobを設定することもできます。

shopt -s dotglob

zshでは、一致しない場合のエラーを防ぐために、さらにnullglobを設定する必要があります。

setopt nullglob

または、パターンにグロブ修飾子Nを追加します。

for file in /path/{.,}*(N); do echo "$file"; done
26
jimmij