GNU/Linux >> Linux の 問題 >  >> Linux

Bash:ls * フォルダーのグループ化なし

出力を変更しないと不可能のようですが、簡単な代替方法を次に示します:

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 つ以上の / を含む行を削除します


Linux
  1. フォルダから最も古いファイルを削除するためのBashスクリプト?

  2. フォルダ内のすべてのシェル スクリプトを実行する

  3. ~/.bashrc を bash コマンドを使わずに復元する

  1. bashでパスと拡張子なしでファイルのベース名を抽出します

  2. フォルダーから最も古いファイルを削除する Bash スクリプト

  3. sftp を壊さずに .bashrc を使用する

  1. 行番号のない Bash 履歴

  2. tar を使用してフォルダー構造のないファイルを抽出するにはどうすればよいですか

  3. プロジェクトフォルダーなしのgit clone