まあ、これを重複してすぐに終了する前に説明します。私は次のような多くの方法を試しました。
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
私のホームフォルダ内のすべてのフォルダを正しく反映しています。何が起こっているのか知っている人はいますか?
答え1
これを*
シェルグロービング(パス名拡張)演算子(?
また[]
)と呼び、引用符なしで呼び出すと、現在のディレクトリ内のすべてのファイル(ディレクトリプレフィックスなし)に展開されます。たとえば、プレフィックスを使用すると、/foo/*
ディレクトリ内のすべてのファイルに展開されます/foo
。
特定のファイルを一致させるためにも使用されます。たとえば、foo
現在のディレクトリで始まり終わるファイルだけを一致させるには、globパターンを使用します。bar
foo*bar
したがって、for
ループは次の形式を取ることができます。
for f in foo*bar; do echo "$f"; done
man
シェルワイルドカードの詳細については、シェルページをお読みください。
答え2
ディレクトリ内のファイル(およびサブディレクトリ)を繰り返すには、次を使用できます。
for file in /Applications/*
do
echo "$file"
done
一致するものがない場合、file
変数に/Applications/*
リテラル文字列(アスタリスクを含む)が含まれ、次のコマンドに既存のパスが必要な場合はエラーが発生する可能性があります。ファイルが一致せずに何もしないようにするには、次のnullglob
オプションを使用できます。
shopt -s nullglob
for file in /Applications/*
do
echo "$file"
done
答え3
〜のようにジェフ・シャーラーは次のように指摘しています。、
*
通常は次のように動作しますls
。次の名前は表示されません。.
(一定期間)。 bashを使用していて名前を取得したい場合.
、 S等(開く)シェンエルザ選ぶイオンdotglob
と命令shopt -s dotglob
*
これにより、次のことが起こりますls -A
。まだ表示されません。.
そして..
それ自体ですが、次のように表示されます。.
。あなたの質問に「ディレクトリのすべて」が記載されています。やや曖昧な表現です。
/Applications
(トップ)ディレクトリ内のすべてを意味する場合は、他の答えは問題ありません。しかし、その中にすべてを入れたい場合/Applications
木 (つまり、/Applications
ディレクトリ内のすべておよび対応するサブディレクトリglobstar
)、bashを使用している場合は、次のコマンドを使用してシェルオプションを設定します。shopt -s globstar
これにより
**
ファイル名の一部としてここと以下のすべてを意味します。だからfor file in /Applications/** do echo "$file" done
ディレクトリ(ファイル、ディレクトリなど)のすべてのオブジェクトを一覧表示します。
/Applications
木。同じコンポーネントレベルの他の文字と組み合わせることはできません。つまり、同様の操作を実行できません
foo**bar
。ただし、たとえば、次のようにすることができます**
。for file in /Applications/**/README
README
ツリーに名前が付いたすべてのファイルを繰り返します/Applications
。for file in /Applications/**/*.txt
で終わるすべての名前を見つけます
.txt
。たとえば、次のように複数のオプションを同時に設定できます。
shopt -s dotglob globstar
完全なオプションのリストについては、bashのドキュメントを参照してください。あなたはできますあなたnsetオプションは
shopt -u
。"$file"
妥当な理由がなく、実行中の作業を確実に知っていない限り、常にすべてのシェル変数参照(例:)を引用する必要があります。
答え4
この形式を使用すると、「ls」のすべてのリストとソートオプションから選択できます。
ls -at $DIR | while read i; do echo $i; done