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


12

入力した場合:

ls source/*

source/fonts:
fontello

source/images:
bg1.png                eng.png        fra.png   

フォルダー名でグループ化されたファイルのリストを取得します。ファイル名のリストを取得するにはどうすればよいですか?

ls source/*

source/fonts/fontello
source/images/bg1.png
source/images/eng.png
source/images/fra.png   

サンクス


これがスクリプト用の場合は、mywiki.wooledge.org/ParsingLsをご覧ください。(そうは言っfindても、間違った使い方もあります。特に、実行for file in $(find ...)している場合は、そのうちの1つにぶつかったことになります)。
チャールズダフィー

回答:


13

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

find source/ -type f

または(GNU findに固有)、質問の深さのファイルのみを取得するには:

find source/ -type f -mindepth 2 -maxdepth 2

(またはあなたがls与えるようなディレクトリが必要な場合は、削除します-type f


5

サイケデリック(ls -d)を追加すると、単にlsに固執することができます:

# mkdir test
# cd test
# mkdir A B C
# touch {A,B,C}/file*
# ls -d */*    
A/file  B/file  C/file

@Cthulhuわかりました、私の例は短すぎます。A、B a / o Cにフォルダがある場合、-dは選択したものだけを表示するのに役立ちます。私は実際に見つけるのが好きではなく、ls -dで引数によって深さを定義できます
-ikrabbe

他の回答を編集して、深さを制限することを提案しました。
o11c

@ o11cは非常に優れていますfindが、それでも太った獣です。
ikrabbe

3

「貧乏人の」に興味があるかもしれません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つの出力をリダイレクトする第二のファイルに上記の出力をリダイレクトして、使用する可能性があるcommdiffまたは類似した何か、最初から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
やった

ノート:

  • ときにls端末に出力し、それはではありませんされて-lリットルオング)モード(名前が非常に長い場合を除き)、それは行ごとに複数の名前を書き込みます。-1(1)を指定するか、出力をファイルまたはパイプにリダイレクトすることで、1行に1つの名前を書き込むように強制できます。
  • 内容を作成したディレクトリをリストしているので、おそらくコマンド--では実際には必要ありませんls*で始まるファイル名に対する保護として、不明なディレクトリにリストするときに使用する必要があります-
  • からの出力を解析しようとしないでくださいls
  • globstarシェルのオプションはPOSIXで定義されていないように見えます。(実際、POSIXがシェルオプションを認識するどうかはわかりません。)bashismのように見えますが、注意してください。bashのすべてのバージョンに存在するわけではありません。
  • fontsまたはimagesサブディレクトリがある場合**、すべてのサブディレクトリを再帰的に一覧表示します。深さを制限する1つの(やや気味が悪く信頼できない)方法は

    ls -d --file-type -- source/** | grep -v '\(/.*\)\{3\}'
    

    3つ以上の/文字を含む行を削除します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.