ディレクトリ内のすべての項目を繰り返しますか?

ディレクトリ内のすべての項目を繰り返しますか?

まあ、これを重複してすぐに終了する前に説明します。私は次のような多くの方法を試しました。

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

  1. 〜のようにジェフ・シャーラーは次のように指摘しています。*通常は次のように動作しますls。次の名前は表示されません。.(一定期間)。 bashを使用していて名前を取得したい場合.S等(開く)シェンエルザ選ぶイオンdotglobと命令

    shopt -s dotglob
    

    *これにより、次のことが起こりますls -A。まだ表示されません。.そして..それ自体ですが、次のように表示されます。.

  2. あなたの質問に「ディレクトリのすべて」が記載されています。やや曖昧な表現です。/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

  3. たとえば、次のように複数のオプションを同時に設定できます。

    shopt -s dotglob globstar
    

    完全なオプションのリストについては、bashのドキュメントを参照してください。あなたはできますあなたnsetオプションはshopt -u

  4. "$file"妥当な理由がなく、実行中の作業を確実に知っていない限り、常にすべてのシェル変数参照(例:)を引用する必要があります。

答え4

この形式を使用すると、「ls」のすべてのリストとソートオプションから選択できます。

ls -at $DIR | while read i; do echo $i; done

関連情報