出力を変更しないと不可能のようですが、簡単な代替方法を次に示します:
find source/ -type f
または (GNU find に固有)、質問の深さでファイルのみを取得するには:
find source/ -type f -mindepth 2 -maxdepth 2
(または ls
のようなディレクトリが必要な場合 -type f
を削除してください )
サイケデリック (ls -d
):
# mkdir test
# cd test
# mkdir A B C
# touch {A,B,C}/file*
# ls -d */*
A/file B/file C/file
あなたは「貧乏人のfind
」に興味があるかもしれません 」:
shopt -s globstar
shopt -s
指定されたシェル オプションを設定します。 globstar
オプションは、bash(1) で次のように定義されています:
設定されている場合、パターン **
ファイル名/パス名展開コンテキストで使用されるファイル [sic] と一致します およびゼロ以上のディレクトリとサブディレクトリ。パターンの後に /
が続く場合 、ディレクトリとサブディレクトリのみが一致します。
shopt -s globstar
を実行したら、 、次のいずれかのコマンド:
ls -d1 -- source/** # The character after the ‘d’ is the digit one. ls -d -- source/** | cat # i.e., it will write that into a pipe to any command. 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 つの出力を 1 つのファイルにリダイレクトし、上記の出力を 2 番目のファイルにリダイレクトしてから、comm
を使用することができます。 、 diff
、または同様のものを使用して、最初のファイルから 2 番目のファイルを減算し、プレーン ファイル (ディレクトリ以外) のみを残します。しかし、そうしないでください。
別のアプローチ (それはあまりありません) より良い) です
ls -d --file-type -- source/** | grep -v '/$'
--file-type
オプションは ls
を伝えます /
を表示するには 次のように、各ディレクトリ名の最後に (および他の (特別な) ファイルタイプの最後にある他の文字):
source// # Added an extra one source/fonts/ # Added one source/fonts/fontello source/images/ # Added one 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/\*$//'
すべてのファイル (およびファイルのみ) で何かをしたい場合は、次のことができます
for f in source/** do if [ -f "$f" ] then Insert commands to be applied to plain files here. fi done
注:
ls
の場合 端末に出力していますが、-l
にはありません (l ong) モードでは、1 行に複数の名前が書き込まれます (名前が非常に長い場合を除きます)。-1
を指定すると、1 行に 1 つの名前を強制的に書き込むことができます。 (1 つ)、または出力をファイルまたはパイプにリダイレクトします。- おそらく
--
は本当に必要ないでしょうls
で コマンドは、コンテンツを作成したディレクトリをリストしているためです。*
をリストするときに使用する必要があります。-
で始まるファイル名に対する保護として、不明なディレクトリに . ls
からの出力を解析しようとしないでください .globstar
shell オプションは POSIX で定義されていないようです。 (実際、POSIX が すべて を認識するかどうかはわかりません シェルオプション)bash
のようですが ism、注意 — bash のすべてのバージョンには存在しない可能性があります。-
fonts
の場合 またはimages
サブディレクトリあり**
それらをすべて、再帰的に、ずっと下にリストします。深さを制限する 1 つの (やや雑で信頼性の低い) 方法は、ls -d --file-type -- source/** | grep -v '\(/.*\)\{3\}'
3 つ以上の
/
を含む行を削除します