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

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

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

for file in `ls -a`; do

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

答え1

スペースで区切られた glob に一致するファイルのリストを作成するだけです。

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 を設定して、ドット ファイルを pure と一致させることもできることに言及する価値があります*

shopt -s dotglob

一致しない場合にエラーを防ぐために、zsh追加の設定が必要です。nullglob

setopt nullglob

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

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

関連情報