web-dev-qa-db-ja.com

現在のディレクトリ内の通常のファイルのみをリストします(ディレクトリはリストしません)

使うことができます ls -ld */現在のディレクトリ内のすべてのディレクトリエントリを一覧表示します。現在のディレクトリにあるすべての通常のファイルを一覧表示する同様に簡単な方法はありますか? findを使用できることはわかっています

find . -maxdepth 1 -type f

または統計

stat -c "%F %n" * | grep "regular file" | cut -d' ' -f 3-

しかし、これらは私に過度にエレガントであるとは思わない。現在のディレクトリのサブディレクトリではなく、通常のファイル(デバイス、パイプなどは関係ありません)のみを一覧表示する簡単な方法はありますか?シンボリックリンクもリストすることはプラスですが、必須ではありません。

132
daniel kullmann

zshGlob Qualifiers を使用すると、簡単に直接表現できます。例:

_echo *(.)
_

構成に応じて、通常のファイルのリストのみを返すか、エラーを返します。

非ディレクトリの場合:

_echo *(^/)
_

(シンボリックリンク(ディレクトリを含む)、名前付きパイプ、デバイス、ソケット、ドアなどが含まれます)

_echo *(-.)
_

通常のファイルと通常のファイルへのシンボリックリンク。

_echo *(-^/)
_

ディレクトリ以外の場合、ディレクトリへのシンボリックリンクもありません。

また、[〜#〜] d [〜#〜]otファイル(非表示)を含める場合は、Dグロビング修飾子を参照してください。ファイル)、*(D-.)など。

36
Ulrich Dangel
ls -p | grep -v / 

このコマンドは、ディレクトリではないすべての非表示でないファイル(通常のファイル、リンク、 デバイスファイル など)を一覧表示します。隠しファイルも含めるには、ls-Aオプションを追加します

ファイルの名前に改行文字が含まれていないことを前提としています。 -qオプションをlsに追加すると、改行を含むすべての印刷不能文字が?に変換され、1行にあることが保証され、次のような行ベースのユーティリティへのフィードに適しています。 grepおよび端末での印刷用。

177
Athul Biju

通常のファイルのみをリストするには:

ls -al | grep '^-'

(任意のタイプのファイルへの)シンボリックリンクが含まれている場合:

ls -al | grep '^[-l]'

リストの最初の文字がファイルのタイプを表しているので、-は、それが通常のファイルであることを意味します。シンボリックリンクはlです。

Debian/Ubuntu

一致するすべてのファイル(リンクを含む)の名前を出力します。

run-parts --list --regex . .

絶対パスで:

run-parts --list --regex . "$PWD"

pで始まりdで終わる/etc内のすべてのファイルの名前を出力します。

run-parts --list --regex '^p.*d$' /etc
24
kenorb

lsにはそれを行うオプションはありませんが、unixとlinuxの優れた点の1つは、長くてエレガントでないパイプラインをシェルスクリプト、関数、またはエイリアスに簡単に変換できることです。これらは、他のプログラムと同じようにパイプラインで使用できます。

(注:関数とエイリアスにはいくつかのスコープの問題があります。スクリプトは、それらを読み取って実行できるすべての実行可能ファイルで使用できます。エイリアスと関数は、現在のシェルでのみ使用できます-サブシェルの.profile/.bashrcなどは再定義できますまた、スクリプトは、bash/sh、awk、Perl、pythonなどを含む、あらゆる言語で書くことができます。どちらが仕事に最適であるか、またはあなたが最も精通しているもの)

例えば.

alias lsf='find . -maxdepth 1 -type f -print0 | xargs -0r ls'

Xargsを追加して、通常のlsオプションをすべて使用できるようにしました。 lsf -lrS

findを使用しているため、通常は非表示になっているすべてのドットファイルが表示され、すべてのファイル名の先頭に./が付けられます-これが唯一の違いです。

! -iname '.*'でドットファイルを除外することもできますが、ドットファイルを表示するバージョンと表示しないバージョンの2つのバージョンのエイリアスが必要になります。

alias lsf2='find . -maxdepth 1 -type f -a ! -iname '\''.*'\'' -print0 | xargs -0r ls'

または、lsfがエイリアスではなくスクリプトである場合は、オプションを解析して(おそらくgetoptsまたは/ usr/bin/getoptなどで)、-aが存在しない限り、ドットファイルを除外できます。

15
cas
bash-4.2$ ls -F | grep -v '[/@=|]$' | more

Lsの-Fオプションは、*を実行可能ファイルに、/をディレクトリに、@をシンボリックリンクに、=をソケットに、|を|に追加します。 FIFOに。次に、grepを使用して、正規でないファイル文字を出力から除外し、ファイルを取得できます。これはzshだけでなく、どのシェルでも機能します。

弱点は次のとおりです。

  1. 名前が@=、または|で終わるファイルはすべて除外されます(ただし、これらの文字が名前に含まれているファイルは実際には使用しないでください)。
  2. これは、デバイスファイルや、ドアなどの一部のシステム上のエキゾチックな種類のファイルを除外しません。
  3. 実行可能なすべてのファイルにアスタリスクが追加されます。これは、sedをパイプ処理して出力から「*」文字を削除することで処理できます。
  4. 改行文字を含むファイル名がある場合、これは正しく機能しません。
8
kurtm

マニュアルでは、「f」オプションは「通常のファイル」に対してのみ有効であり、パイプ、ソケット、またはブロック/文字デバイスに対しては無効であると述べています。つまり、すでに正しいことを行っています。

   -type c
          File is of type c:

          b      block (buffered) special

          c      character (unbuffered) special

          d      directory

          p      named pipe (FIFO)

          f      regular file

          l      symbolic link; this is never true if the -L option or the
                 -follow option is in effect, unless the symbolic link  is
                 broken.  If you want to search for symbolic links when -L
                 is in effect, use -xtype.

          s      socket

          D      door (Solaris)
3
daisy

これは特に短いわけではありませんが、すばやく呼び出す必要がある場合は、スクリプトまたはエイリアスに変換できます。入力配列としてlsコマンドを使用し、grepにパイプされた各エントリでls -ldを呼び出して、出力がnullに送信されたディレクトリを除外し、成功した場合は元の入力をエコーし​​ます。

for list in `ls` ; do ls -ld $list | grep -v ^d > /dev/null && echo $list ; done ;

同じ結果であるgrepと条件付き出力を反転できます。

for list in `ls` ; do ls -ld $list | grep ^d > /dev/null || echo $list ; done ;
0
Don R

これは少し古いスレッドですが、ファイルのみを一覧表示する最もクリーンな方法です。

ls -al | grep '^-' | awk '{print $9}'
0
R J