web-dev-qa-db-ja.com

ディレクトリ内のすべてをループしますか?

申し訳ありませんが、これが複製としてすぐにクローズされる前に、説明させてください。私は次のような多くの方法を試みました:

for d in /Applications ; do
   echo "$d"
done

しかしそれは戻る

/アプリケーション

/ Applicationsの内容の代わりに。

私も試しました:

#!/bin/bash
FILES=/Applications

for file in $FILES
do
   echo $file
done

これは基本的に同じことです。しかし、私が気づいたのは、次のような場合です。

#!/bin/bash

for file in *
do
    echo $file
done

ホームフォルダー内のすべてのフォルダーが正しくエコーされます。誰が何が起こっているのか知っていますか?

4
Jack
  1. Jeff Schallerによる注記 と同様に、_*_は通常lsのように機能します— _._(ピリオド)。 bashを使用していて、名前が_._で始まるものを取得したい場合、s et(オンにする)sh = ell opt ion dotglobコマンドで

    _shopt -s dotglob
    _

    これにより、_*_は_ls -A_のように機能します— _._および_.._自体は表示されません。 _._で始まる他のすべてを表示します。

  2. あなたの質問は「ディレクトリ内のすべて」について言及しています。これはややあいまいなフレーズです。 (トップレベルの)_/Applications_ディレクトリ内のすべてを意味する場合は、他の回答で問題ありません。しかし、_/Applications_ tree のすべてが必要な場合(つまり、_/Applications_ディレクトリとそのサブディレクトリのすべて) )、bashを使用している場合は、コマンドでシェルオプションglobstarを設定します

    _shopt -s globstar
    _

    これにより、_**_ がファイル名コンポーネントとしてここと以下のすべてを意味します。そう

    _for file in /Applications/**
    do
        echo "$file"
    done
    _

    _/Applications_ tree 内のすべてのオブジェクト(ファイル、ディレクトリなど)をリストします。

    これを同じコンポーネントレベルで他の文字と組み合わせることはできません。つまり、_foo**bar_のようなことはできません。ただし、_**_の後に他のコンポーネントを追加します。例えば、

    _for file in /Applications/**/README
    _

    _/Applications_ツリー内のREADMEという名前のすべてのファイルをループし、

    _for file in /Applications/**/*.txt
    _

    名前が_.txt_で終わるすべてのファイルを検索します。

  3. 一度に複数のオプションを設定できます。例:

    _shopt -s dotglob globstar
    _

    オプションの完全なリストについては、bashのドキュメントを参照してください。 n _shopt -u_でオプションを設定できます。

  4. 正当な理由がない限り、常にすべてのシェル変数参照を引用する必要があります(例:_"$file"_)。また、何をしているのか確実にわかっている場合は除きます。

ディレクトリ内のファイル(およびサブディレクトリ)を反復処理するには、次を使用できます。

for file in /Applications/*
do
    echo "$file"
done

一致するものが見つからない場合、file変数には/Applications/*文字列(アスタリスク付き)。これは、次のコマンドが既存のパスを想定している場合にエラーを引き起こす可能性があります。一致するファイルがない場合に何もしない場合は、nullglobオプションを使用できます。

shopt -s nullglob
for file in /Applications/*
do
    echo "$file"
done
8
user000001

*はシェルグロビング(パス名展開)演算子(?および[]も)と呼ばれ、引用符なしで呼び出すと、現在のディレクトリ内のすべてのファイルに展開されます(任意のディレクトリプレフィックス)。接頭辞を使用する場合。 /foo/*、それはディレクトリ/foo内のすべてのファイルに展開されます。

これは特定のファイルを照合するためにも使用されます。たとえば、現在のディレクトリのfooで始まりbarで終わるファイルのみを照合するには、globパターンを使用します。

foo*bar

したがって、forループは次の形式になります。

for f in foo*bar; do echo "$f"; done

シェルのmanページを読んで、シェルのグロビングについてさらに理解を深めてください。

8
heemayl