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


126

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

find . -maxdepth 1 -type f

またはstat

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

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


5
「非常にエレガント」とはどういう意味ですか?私の知る限り、findコマンドはあなたが望むことをするための最良の方法です。信頼性の高い他のオプションについては、シェル固有のコマンドを検討する必要があります(これらは移植性のないものです)。
ラーム

@rahmu私はに似たものを探していましたls -d */。これは短く、入力しやすく、理解しやすいものです。したがって、zshを使用していない場合でも、Ulrich Dangelの答えにはかなり満足しています。
ダニエルクルマン

回答:


32

zshグロブ修飾子あなたが簡単に例えば、直接それを表現することができます:

echo *(.)

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

非ディレクトリの場合:

echo *(^/)

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

echo *(-.)

通常ファイルおよび通常ファイルへのシンボリックリンク用。

echo *(-^/)

非ディレクトリ用で、ディレクトリへのシンボリックリンクもありません。

また、DなどのD otファイル(隠しファイル)を含める場合は、グロビング修飾子を参照してください*(D-.)


170
ls -p | grep -v / 

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

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


14
+1、これは良い答えです。コメントなしで新しいユーザーを投票することは、特に有効な答えが提供されている場合、私にとってかなり衝撃的です。ファイル名に改行が含まれている場合は、これが適切に機能しない唯一のエッジケースです。また、サポートされている場合は、色を保持することも便利です。GNUのためには、追加することができる--color=alwayslsOSXのために、-G
グレアム14

こんにちは、あなたが与えたコマンドは素晴らしいですし、確かに私を助けますが、上記のコマンドを使用して同時にファイルのアクセス権を変更することが可能かどうか疑問に思っていましたか?sudo chmod 777最後に追加しようとしましたが、エラーが表示されました...助けて
いただければ幸いです

3
ディレクトリを指すシンボリックリンクも除外したい場合はそうしますls -pL | grep -v /。追加された-L逆参照シンボリックリンク。
マティアスブラウン

1
ワイルドカードフィルタも使用する場合は、実行しますls -pdL something* | grep -v /。追加された-dオプションは、ディレクトリの内容ではなくディレクトリ自体をリストするため、それらは正しく除外されます。
-Rockallite

そして、フォルダーなしですべてのファイルを取得したい場合は、-vを削除してください
jasonleonhard

23

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

ls -al | grep '^-'

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

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

リストの最初の文字がファイルの種類を説明している-ため、シンボリックリンクはであるため、通常のファイルであることを意味しますl

Debian / Ubuntu

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

run-parts --list --regex . .

絶対パスの場合:

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

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

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

15

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つのバージョンが必要になります。1つはドットファイルを表示し、もう1つは表示しません。

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

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


-name十分です、あなたは必要ありません-iname
トーター14年

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

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

弱点は次のとおりです。

  1. 名前がで終わるか@、除外されるファイル(ただし、名前にこれらの文字が含まれているファイルは実際にはないはずです)=|
  2. これは、ドアのような一部のシステム上のデバイスファイルまたは一部の特殊なタイプのファイルを除外しません。
  3. 実行可能なファイルにはアスタリスクが付加されます。これは、sedをパイピングして出力から「*」文字を削除することで処理できます。
  4. 改行文字を含むファイル名がある場合、これは適切に機能しません。

これを書いているシステムでは、ファイルの10%に=@または|文字を含む名前が付いています。=base64またはquoted-printableでエンコードされた部分を持つmaildirまたはファイル名で一般的です。@ロケール定義で、メールアドレスなどに。ただし、ファイル名の最後に表示されることはまれです。(例えば、このシステム上で2.2百万人のわずか31アウト)
ステファンChazelas

3

マニュアルでは、「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)

0

これは特に短いものではありませんが、すぐに呼び出す必要がある場合は、スクリプトまたはエイリアスに変換できます。入力配列として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 ;

\dev\null?!?!
マナトワーク


0

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

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


1
touch "some file name"簡単な反例を見るために
ジェフシャラー

@JeffSchaller有効なポイントがあります。そのためにこのようなもの。ls -al | grep '^-' | awk '{ for(i=9; i<=NF; ++i) printf $i""FS; print "" }'、スペースを含むファイルを処理する必要があります。
RJ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.