出力を変更しないと不可能のようですが、簡単な代替方法を次に示します:
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からの出力を解析しようとしないでください .globstarshell オプションは POSIX で定義されていないようです。 (実際、POSIX が すべて を認識するかどうかはわかりません シェルオプション)bashのようですが ism、注意 — bash のすべてのバージョンには存在しない可能性があります。-
fontsの場合 またはimagesサブディレクトリあり**それらをすべて、再帰的に、ずっと下にリストします。深さを制限する 1 つの (やや雑で信頼性の低い) 方法は、ls -d --file-type -- source/** | grep -v '\(/.*\)\{3\}'3 つ以上の
/を含む行を削除します