使うことができます ls -ld */
現在のディレクトリ内のすべてのディレクトリエントリを一覧表示します。現在のディレクトリにあるすべての通常のファイルを一覧表示する同様に簡単な方法はありますか? findを使用できることはわかっています
find . -maxdepth 1 -type f
または統計
stat -c "%F %n" * | grep "regular file" | cut -d' ' -f 3-
しかし、これらは私に過度にエレガントであるとは思わない。現在のディレクトリのサブディレクトリではなく、通常のファイル(デバイス、パイプなどは関係ありません)のみを一覧表示する簡単な方法はありますか?シンボリックリンクもリストすることはプラスですが、必須ではありません。
zsh
と Glob Qualifiers を使用すると、簡単に直接表現できます。例:
_echo *(.)
_
構成に応じて、通常のファイルのリストのみを返すか、エラーを返します。
非ディレクトリの場合:
_echo *(^/)
_
(シンボリックリンク(ディレクトリを含む)、名前付きパイプ、デバイス、ソケット、ドアなどが含まれます)
_echo *(-.)
_
通常のファイルと通常のファイルへのシンボリックリンク。
_echo *(-^/)
_
ディレクトリ以外の場合、ディレクトリへのシンボリックリンクもありません。
また、[〜#〜] d [〜#〜]otファイル(非表示)を含める場合は、D
グロビング修飾子を参照してください。ファイル)、*(D-.)
など。
ls -p | grep -v /
このコマンドは、ディレクトリではないすべての非表示でないファイル(通常のファイル、リンク、 デバイスファイル など)を一覧表示します。隠しファイルも含めるには、ls
に-A
オプションを追加します
ファイルの名前に改行文字が含まれていないことを前提としています。 -q
オプションをls
に追加すると、改行を含むすべての印刷不能文字が?
に変換され、1行にあることが保証され、次のような行ベースのユーティリティへのフィードに適しています。 grep
および端末での印刷用。
通常のファイルのみをリストするには:
ls -al | grep '^-'
(任意のタイプのファイルへの)シンボリックリンクが含まれている場合:
ls -al | grep '^[-l]'
リストの最初の文字がファイルのタイプを表しているので、-
は、それが通常のファイルであることを意味します。シンボリックリンクはl
です。
一致するすべてのファイル(リンクを含む)の名前を出力します。
run-parts --list --regex . .
絶対パスで:
run-parts --list --regex . "$PWD"
p
で始まりd
で終わる/etc
内のすべてのファイルの名前を出力します。
run-parts --list --regex '^p.*d$' /etc
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
が存在しない限り、ドットファイルを除外できます。
bash-4.2$ ls -F | grep -v '[/@=|]$' | more
Lsの-Fオプションは、*を実行可能ファイルに、/をディレクトリに、@をシンボリックリンクに、=をソケットに、|を|に追加します。 FIFOに。次に、grepを使用して、正規でないファイル文字を出力から除外し、ファイルを取得できます。これはzshだけでなく、どのシェルでも機能します。
弱点は次のとおりです。
@
、=
、または|
で終わるファイルはすべて除外されます(ただし、これらの文字が名前に含まれているファイルは実際には使用しないでください)。マニュアルでは、「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)
これは特に短いわけではありませんが、すばやく呼び出す必要がある場合は、スクリプトまたはエイリアスに変換できます。入力配列として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 ;
これは少し古いスレッドですが、ファイルのみを一覧表示する最もクリーンな方法です。
ls -al | grep '^-' | awk '{print $9}'