lsによって印刷されるファイルの数を制限するにはどうすればよいですか?


89

lsコマンドでリストされるファイルの量を制限する方法はありますか?

私は見た:

ls | head -4

しかし、取得headまたは実行するには、実行が完了tailするまで待機する必要がありますls。また、ディレクトリには膨大な量のファイルがあり、かなりの時間がかかる可能性があります。

lsそのheadコマンドを使用せずに制限するコマンドを実行したい。

回答:


109

やってみました

ls -U | head -4

これはソートをスキップするはずlsです。これがおそらく時間がかかる理由です。

https://stackoverflow.com/questions/40193/quick-ls-command


「ls -U」はまだ印刷前にディレクトリ全体を読み取ります...ファイルを制限するための小さなスクリプトを書くと思いますが、その質問リンクは良い読み物です。ニコありがとう。
アンドレデュラオ

5
@ AndreDurao、GNU ls -Uは印刷前にディレクトリ全体を必ずしも読み取るとは限りません。strace -e getdents,write ls -U > /dev/nullたとえば、大きなディレクトリで試してください。
ステファンシャゼル

注:OSXでstraceを実行してdtraceを探す場合、straceコマンドはLinuxユーティリティです
-AndreDurao

12

のバージョンにGNU lslsなどのファイルをソートしない方法がある場合は、それを使用します。オプションを指定しないと、最初にすべてのファイルが読み取られ、次に名前がソートされてから印刷が開始されます。-Uls

別の可能性は、実行するfindことです。これは、名前を見つけたときに出力します。

find . -name . -o -prune | head

(以降ということに注意してくださいheadに取り組んでいるライン、それはファイル名が改行文字が含まれていないと仮定し)。


1
GNUの場合がありますfind(busyboxのか家宝とは対照的に、findまたはGNU ls -U)、印刷を開始する前に、ディレクトリ全体を読み込むようです。
ステファンシャゼル

4

おそらく、あなたは以外のツールを必要としていますlsか?

たとえば、Randal Schwartzには、大きなディレクトリでの使用perlに関するブログエントリがあります。このディレクトリには、ニーズを満たす何かを構築するためのヒントが含まれている場合があります。

ブログの投稿で、Randalはその両方lsを説明しfind、すべてを印刷する前にすべてのディレクトリエントリを読み取ろうとしますが、perl彼が提案する解決策はそうではありません。


また、lsとfindの両方が印刷前にディレクトリ全体を読み取るため、これが最良の選択肢になると考えました。AFresh1をありがとう、真珠の代わりにそれを行うためにルビースクリプトを書くつもりでした!
アンドレデュラオ

1
@AndreDurao、perlおそらくreaddir(3)like lsまたはを使用しfindます。readdir(3)GNU / Linuxの現在のバージョンに少なくとも呼び出し行いgetdents()大きいとシステムコール数を(実際に一般に、システムの数が行われて呼び出し減少させることによって性能を最適化しないこと)。しかし、あなたの場合、必要なファイルが少ない場合は、代わりにreaddirBSD getdirentries(3)またはgetdents(2)システムコールをバイパスして使用する必要があるようです。
ステファンシャゼル

3

(この問題の複製として閉じられた質問のように)パフォーマンスが問題にならず、ls非出力のリストに(出力の最初のn行ではなく)最初のnファイルをリストしたい場合ファイル名でソートされた隠しファイルでzsh、を使用できます:

ls -ld -- *([1,4])

最初の4つのファイルをリストします。zshただし、並べ替えないように指定した場合でも、ディレクトリのコンテンツ全体が読み取られます*(oN[1,4])(そのリストls 並べ替えられることに注意してください)。


1

たぶんあなたのニーズにより適しているのは少ないですか?

 ls /usr/bin | less

私にとっては、古典的なHDDを搭載した5歳のラップトップで即座に動作しますが、頭も同様に高速です。

less途中で終了することがありますq

1秒の遅延の原因についてのあなたの仮定は間違っていると思いますが、おそらくあなたのUnixフレーバーまたはシェル、lessまたはheadコマンドに依存します。

Linuxでは、GNU-lsを使用して、

 ls -R /usr | less 

出力全体が実行中および実行中に、すぐに出力を開始します-したがって、lessが開始する前に、完全に終了しません。出力に応じて、1秒以上の一定の遅延があるかどうかを確認できます。

あなたの1秒の遅延には別の理由があると思います、おそらくHDDはスリープ状態になり、ウェイクアップが必要ですか?

ごく少数のファイルでもこの​​ような遅延がありますか?


感謝しますが、私はそのようなものを探していませんでした。headと同様に、lessは結果全体のls結果で実行されます。結果を制限する方法を探していました。
アンドレデュラオ

@AndreDurao:コメントを答えに移動しました。
ユーザー不明

0
ls -lrth | tail

ls -lrth | tail -n 10

ls -lrth | grep *.gz | tail

申し訳ありませんが、Abhishekですが、この質問のポイントはls、bashでコマンドを使用することです。パイプで連結されたのようなコマンドをgrepheadtailまたは他の人が後に実行されているls
AndreDurao

0
$ cut -f 1,n filename

最初のnファイルを取得するタスクを実行します。 n抽出するファイルの数です。完全なコードは次のようになります。

$ ls|cut -f 1,n file

1
ls | cut -f 1,n fileあなたがテキストの各ラインの出力最初のn番目のフィールドを希望示唆したコマンドfile、および完全の出力を無視するでしょうls。これは元のポスターが必要とすることをしません。
telcoM

はい、あなたは正しいです。head -n ...これは確かにタスクを実行します。
ラマンディープシン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.