「貧乏人の」に興味があるかもしれませんfind
:
shopt -s globstar
shopt -s
s名前付きシェルオプションを設定します。このglobstar
オプションは、bash(1)で次のように定義されています。
設定されている場合**
、ファイル名/パス名展開コンテキストで使用されるパターンは、ファイル[sic]と0個以上のディレクトリおよびサブディレクトリに一致します。パターンの後にが続く場合、/
ディレクトリとサブディレクトリのみが一致します。
したがって、完了したらshopt -s globstar
、次のコマンドのいずれかを実行します。
ls -d1-source / ** #「d」の後の文字は数字の1です。
ls -d-source / ** | cat #つまり、それを任意のコマンドへのパイプに書き込みます。
printf "%s \ n" source / **
出力を生成します:
source/
source/fonts
source/fonts/fontello
source/images
source/images/bg1.png
source/images/eng.png
source/images/fra.png
残念ながら、これにはディレクトリ名も含まれます。それを知るのに少し役立つかもしれません
printf "%s\n" source/**/
出力を生成します:
source/
source/fonts
source/images
つまり、ディレクトリ名のみ。あなたは、一つのファイルにコマンドの最初のセットの1つの出力をリダイレクトする第二のファイルに上記の出力をリダイレクトして、使用する可能性があるcomm
、diff
または類似した何か、最初から2番目のファイルを減算する、唯一の平野を残しますファイル(非ディレクトリ)。しかし、それをしないでください。
別のアプローチ(あまり良くない)は
ls -d --file-type -- source/** | grep -v '/$'
この--file-type
オプションは
、各ディレクトリ名の末尾に(および他の(特殊な)ファイルタイプの末尾にある他の文字)を次のようls
に表示するように指示します/
。
source // #余分な1つを追加
source / fonts / #1つ追加
source / fonts / fontello
source / images / #追加されたもの
source / images / bg1.png
source / images / eng.png
source / images / fra.png
そして、grep -v '/$'
で終わる行を削除し/
ます; すなわち、ディレクトリ名。残念ながら、この--file-type
オプションはPOSIXでは指定されていません。のバージョンがls
サポートしていない場合は、を使用します-F
。それは、実行ファイルの名前の最後にを--file-type
表示することを除いて似ています*
。以下を使用してそれらを削除できますsed
。
ls -dF -- source/** | sed -e '/\/$/d' -e 's/\*$//'
すべてのファイル(およびファイルのみ)で何かをしたい場合は、次のようにします。
source / **のf
行う
if [-f "$ f"]
それから
ここにプレーンファイルに適用するコマンドを挿入します。
fi
やった
ノート:
find
ても、間違った使い方もあります。特に、実行for file in $(find ...)
している場合は、そのうちの1つにぶつかったことになります)。