ディレクトリBashのディレクトリではなくファイルのみを一覧表示するにはどうすればよいですか?


87

回答:


118

使用find

find . -maxdepth 1 -type f

この-maxdepth 1オプションを使用すると、現在のディレクトリ(または、.を何らかのパスに置き換えると、そのディレクトリ)のみが表示されます。そのディレクトリとサブディレクトリ内のすべてのファイルの完全な再帰的リストが必要な場合は、そのオプションを削除するだけです。


mklement0の回答にコメントした後、「find ./*。png-maxdepth 1 -type f> pngs.txt」でもおそらく同じことが達成されることに気付きました。します。スクリプトをインストールせずに。
アレックスホール

2
findMacでは、オプション-type-maxdepthオプションもありません。
Timofey 2016

1
@Tim:-typeそして通常の意味でのオプション-maxdepthはありません。BSD (OS Xで使用される)はそれらをプライマリと呼び、ファイル名オペランドのに来る必要があります(この場合、Linuxとは異なり、BSDバージョンには少なくとも1つの明示的なファイル名オペランドが必要です)。この回答のコマンドは間違いなくMacで機能します。find.
mklement0 2016

1
@AlexHall:(私はお勧めしてもそれは巧妙なソリューションですfind *.png -maxdepth 0 -type f避けるために./、出力ファイル名に接頭辞を、また、注意-maxdepth0ではないが、1)、限り、あなたが必要とするすべてのファイルであるとしてアルファベット順ls[マルチ]タイプのフィルタリングを追加して、他の方法で何ができるか(異なる出力形式/順序、非表示アイテムを含めるかどうかのインライン制御)が必要な場合は、私の回答のスクリプトが役立ちます。
mklement0 2016

1
find * -maxdepth 0 -type f(@AlexHallのコメントから派生した代替案)とfind . -maxdepth 1 -type f答えを比較するとfind . ...、常に非表示の項目が含まれ、出力ファイル名の前に常に接頭辞が付き./、GNU find(Linux)では通常ソートされていないリストが出力されます。find * ...シェルに事前にグロブを実行させるため、デフォルトでは非表示のアイテムを除外し(で変更できますshopt -s dotglob)、アルファベット順にソートされた単なるファイル名(プレフィックスなし)を出力します。どちらのアプローチにもファイルへのシンボリックリンクは含まれていません。-Lこれを行うにはオプションを使用します。
mklement0 2016

15
ls -p | grep -v /

ls -pを使用すると、フォルダ名の後に/を表示できます。これは、削除するタグとして機能します。


後者は相対パスを返し、前者はファイル名のみを返すため、lsに加えてを使用した例を見ると便利ですfind。仕事に適したツールを使用してください。
ベン・アモス

5
  • carlpettのfind回答find . -maxdepth 1 -type f)は原則として機能しlsますが、使用するのとまったく同じで./lsはありません。すべてプレフィックスが付いたソートされていない可能性のあるファイル名のリストを取得し、の多くのオプションを適用する機能を失います
    また、find 常に非表示のアイテムも検出しますがls'の動作は-aまたは-Aオプションの有無によって異なります。

    • 改善によって示唆され、アレックス・ホール問題のコメントでは、することですコンバインシェルグロブではfind

          find * -maxdepth 0 -type f  # find -L * ... includes symlinks to files
      
      • ただし、これはプレフィックスの問題に対処し、アルファベット順に並べ替えられた出力を提供しますが、非表示のアイテムを含めることを(インラインで)制御したりls、他の多くの並べ替え/出力形式オプションにアクセスしたりすることはできません。
  • Hans Roggemanのls+のgrep答えは実用的ですが、長い(-l)出力形式を使用するようにロックします


私が書いたこれらの制限に対処するためにflsfはiltering LSユーティリティ)を

  • 出力の柔軟性をls提供すると同時に、タイプフィルタリング機能も提供するユーティリティ
  • ファイル、ディレクトリ、シンボリックリンクなどのタイプフィルタリング文字を引数のリストの前に配置するだけfですdlls(実行fls --helpまたは詳細fls --manを確認するため)。

例:

fls f        # list all files in current dir.
fls d -tA ~  #  list dirs. in home dir., including hidden ones, most recent first
fls f^l /usr/local/bin/c* # List matches that are files, but not (^) symlinks (l)

インストール

サポートされているプラ​​ットフォーム

  • npmレジストリからインストールする場合:LinuxおよびmacOS
  • 手動でインストールする場合:Bashを備えたUnixライクなプラットフォーム

npmレジストリから

注:Node.jsを使用しない場合でも、そのパッケージマネージャーはnpmプラットフォーム間で機能し、簡単にインストールできます。試してみてください
curl -L https://git.io/n-install | bash

Node.jsがインストールされ、以下のように、インストールします。

[sudo] npm install fls -g

  • 必要かどうかsudoは、Node.js / io.jsのインストール方法と、後でアクセス許可変更したかどうかによって異なります。EACCESエラーが発生した場合は、を使用して再試行してくださいsudo

  • -g確実に世界的なインストールをして置くために必要とされるflsシステムの中で$PATH

手動インストール

  • このbashスクリプトをとしてダウンロードますfls
  • で実行可能にしchmod +x flsます。
  • (macOS)や(Linux)$PATHなどのフォルダに移動またはシンボリックリンクします。/usr/local/bin/usr/bin

1
鮮やかさ。別のスクリプトの作成が含まれる場合でも。リンク先のプレーンテキストソースからテキストファイルにコピーして貼り付け、次のコマンドを使用してCygwinで実行しました:fls.sh f * .png> pngs.txtおよびbingo:パスのない.pngファイルのリスト。しかし、実際には、lsにはDOSの「dir / b」スイッチに匹敵するオプションがありませんか?ls '-help出力の内容を調べましたが、少なくともそのようなものはありません。
アレックスホール

1
@AlexHall:ありがとう。tl; dr:try -1(ナンバーワン); ls実際には、デフォルトで「ベア」出力、つまりファイル名のみになりますが、端末に出力する場合は、列ベースのレイアウト(1行に複数のファイル名)が使用されます。出力行ごとに1つのファイル名を取得するには(dir /bメモリが機能する-1場合はこれを行います)、オプションを使用します。これは、パイプや出力ファイルに送信するときなど、stdoutが端末に接続されていないときに実際に暗黙的にオンになります。
mklement0 2015

2

サブディレクトリなしで、いくつかのディレクトリのコンテンツを一覧表示する

lsサンプルとして、オプションを使用するのが好きです。

  • -l 長いリスト形式を使用する
  • -t 変更時間で並べ替え、最新のものから
  • -r 並べ替え中の逆順
  • -F--classify エントリにインジケータ(* / => @ |の1つ)を追加します
  • -h--human-readable -lおよび-sを使用すると、1K 234M2Gなどの印刷サイズ...

いつか--color他のすべて。(を参照ls --help

フォルダ以外のすべてを一覧表示する

これにより、ファイル、シンボリックリンク、デバイス、パイプ、ソケットなどが表示されます。

そう

find /some/path -maxdepth 1 ! -type d

日付で簡単に並べ替えることができます:

find /some/path -maxdepth 1 ! -type d -exec ls -hltrF {} +

リストファイルのみ:

または

find /some/path -maxdepth 1 -type f

サイズでソート:

find /some/path -maxdepth 1 -type f -exec ls -lSF --color {} +

非表示のエントリの一覧表示を防止する:

名前がドットで始まる非表示のエントリを表示しないようにするには、次を追加し! -name '.*'ます。

find /some/path -maxdepth 1 ! -type d ! -name '.*' -exec ls -hltrF {} +

次に

あなたは置き換えることができます/some/pathによって.のためにリストに、現在のディレクトリまたは..のための親ディレクトリ


1

またはを使用lsして、エイリアスとしてプロファイルに配置することもできます。grepegrep

ls -l | egrep -v '^d'
ls -l | grep -v '^d'

上記の理由でこれをスクリプトに入れることはしませんが、別の手っ取り早い解決策:ls -F | grep -v '/ $'
mooie

1

ファイルの検索:ls -l / home | grep "^-" | tr -s '' | カット-d '' -f 9

ディレクトリの検索:ls -l / home | grep "^ d" | tr -s '' | カット-d '' -f 9

リンクを見つける:ls -l / home | grep "^ l" | tr -s '' | カット-d '' -f 9

tr -s ''は、出力をスペースで区切られたファイルに変換します。cutコマンドは、区切り文字がスペースであることを示し、9番目のフィールド(常にファイル名/ディレクトリ名/リンク名)を返します。

いつも使っています!


うわー!ファイル名にスペースが含まれている場合はどうなりますか?
F. HAURI

「9-」を使用して、9番目のフィールドからすべてを取得します。リンクも9番目のフィールドの後にあるため、この影響を受けます。
リチャード

0
{ find . -maxdepth 1 -type f | xargs ls -1t | less; }

xargsそれを機能させるために追加され、追加情報なしでファイル名のみを表示する-1代わりに使用され-lますls


これには、時間による並べ替えを強制するという点でいくつかのメリットがありますが、それを行うには間違いなく不器用な方法はありませんfind -printf0 '...' | sort -z
Tripleee 2018年

-2

カーペットの答えに追加するだけです。ファイルを非常に便利に表示するには、出力をlsにパイプします。

find . -maxdepth 1 -type f|ls -lt|less

最近変更されたファイルをリスト形式で表示します。これは、多数のファイルをダウンロードしていて、最近のファイルの整理されたバージョンを表示したい場合に非常に便利です。


3
これはおそらく期待どおりに動作しません!ls標準入力を読み取らないため、に何かをパイプすることは無意味lsです。見逃しましたxargsか?
gniourf_gniourf 2015年

別の言い方をすればfind、この回答のコマンドは完全に無視されます。全体的なコマンドは、タイプフィルタリングls -lt | lessを実行しないと同じです。
mklement0 2016

1
GNUfindを使えばできますがfind . -maxdepth 1 -type f -ls。Mac OSでも動作するようですが、適切に移植できるオプションではない-maxdepthと思い-lsます。
トリプリー2018年

-2

「find'-maxdepth '」は古いバージョンのbashでは機能しないため、次を使用します。

$(ls)のfの場合; if [-f $ f]; 次に$ fをエコーし​​ます; fi; 完了


の使用for f in $(ls)は二重に間違っています。でそれを修正することはできfor f in *ますが、引数をecho適切に引用していないため、壊れてしまいます。
トリプリー2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.