ディレクトリなしでファイルをリストし、名前でフィルタリングする方法(lsオプション)


42

というディレクトリがありuploadsます。多数のファイルに加えて、ファイルを含むいくつかのサブディレクトリが含まれています。

(1ステップで)次のことができる方法はありますか。

  1. ルートアップロードディレクトリ内のファイルのみを一覧表示します-サブフォルダ名またはその内容を表示したくありません。

    そして

  2. 次で始まるファイルをリストしないでください t_

私は-d旗について知っていますが、それは私が望むものをまったく得ていません。

回答:


53

これはの仕事のように聞こえfindます。

  • -maxdepth現在のディレクトリのみを返すために使用し、サブフォルダ内を再帰的に検索しない
  • -type fファイルのみを返すために使用し、ディレクトリやデバイスノードなどは返しません。
  • 場合の組み合わせを使用-notして-name、あなたがしたくない名前のファイルを避けるために、

次のようにまとめられるかもしれません。

find /path/to/uploads -maxdepth 1 -type f -not -name 't_*'

ありがとう!私はCLIが初めてで、これまでfindを使用したことはありませんでした。私は間違いなくそれをさらに調査します。
エミーズ

2
@EmmyS:ここでもう1つの便利な小さなトリックが見つかるかもしれません。@Gilles -exec ls -lG -- {} +は、lsの追加オプションを使用して出力を取得するために彼の答えで使用することに言及しました。-lsこのfindにを追加して、lsの詳細ビューをすばやく簡単に近似することもできます。
カレブ

18

GNU ls(つまり、非組み込みLinuxシステムとCygwinのlsコマンド、他の一部のUNIXでも使用可能)には、名前に基づいて一部のファイルを非表示にするオプションがあります。ただし、ディレクトリを無視する方法はありません。

ls --hide='t_*' uploads

別のアプローチは、シェルにマッチングを行わせることです。Bash、ksh、およびzshには、!(t_*)一致するものを除くすべてのファイルに一致する否定パターンがありますt*。bashではこの機能をオンにshopt -s extglobする必要があり、zshではでオンにする必要がありますsetopt ksh_glob。Zshには、^t_*で有効にする必要がある同等の構文もありますsetopt extended_glob。これはまだディレクトリを無視しません。Zshには、名前だけでなくメタデータなどでファイルを照合できる特別な機能があります:glob修飾子(.)一致の最後に追加して、通常のファイルに制限します。否定^は、名前一致構文の一部であるため、^t_*(.)「すべての通常ファイルが一致t_*しない」および「一致する通常ファイルではないすべてのファイル」ではないことを意味しますt_*

setopt extended_glob  # put this in your ~/.zshrc
ls uploads/^t_*(.)

高度なツールを使用していない場合は、Unixでこれを行うことができますfind。通常、コマンドラインで入力するようなものではありませんが、強力で正確です。CalebはすでにGNU findでこれを行う方法を示しています。この-maxdepthオプションは移植性がありません。-prune代わりに、find再帰的に移植を停止するために使用できます。

find uploads/* -type d -prune -o \! -type f -name 't_*' -print

ファイルのお気に入りのオプションで実行するには、-printby -exec ls -lG -- {} +に置き換えlsます。

上記のすべてのコマンドは、ドットファイル(つまり、名前がで始まるファイル)を非表示にします.。それらを表示する場合は、にパス-AするlsD、zsh(ls uploads/^t_*(.D))にglob修飾子を追加します。ではfind、あなたが作るの異なるアプローチを使用することができ、それが唯一のレベルを再帰的(find特別扱いませドットファイルを行います)。これfindは、現在のディレクトリで実行する場合にのみ完全に機能します。

cd uploads && find . -name . -o -type d -prune -o \! -type f -name 't_*' -print

3
デイジョブはありますか?;-)私はあなたの答えの詳細の長さとレベルに絶えず驚いています。UnixSEの最も単純な見た目の質問にさえです。:)
アレックス

ありがとう!素晴らしい詳細。現在、「高度なツール」を持っているかどうかはわかりません。私は職場でMacを使用しています(Linuxは自宅にいるので、これは
いつか役に立つと思い

@EmmyS:私のLinuxボックスでは私の使用が機能する-maxdepthはずですが、Gillesが言う「移植性」の問題は、BSD find(OSXにもあると思います)が少し違う動物なので、彼の答えも必要かもしれません。@Gilles:zshトリックの+1!
カレブ

1
@Gilles:prunes についてそれほどジューシーではないコメントが思い浮かびますが、自分のシステムをいじくり回しているときに、「このコマンドがAIX、Solaris、またはMINIX3」は、およそ...スタンバイ...メーターの読み取りが困難です...で表示がフリーズし0.00ます。
カレブ

2
Gnu lsには--use-telepathyオプションがありませんか?これは、必要なファイルだけを表示する最も簡単な方法です。ただし、ポータブルではない場合があります。
-dubiousjim

8
ls -l /folder | grep ^- | awk '{print $9}'

$9この声明には何が含まれていますか?
エミーズ

3
@EmmyS出力の9番目のフィールド/列を意味します。この答えは、出力解析lsしようとしています
jw013

print IMO、$ NF`の方が優れているでしょう。$ NFはフィールドの数を意味します。これは9であり、A $ Kについて他の人に教える良い機会としてAWKで一般的に使用されます。
イライジャ・リン

1
ls -l | grep -v ^d | grep name$

このソリューション(複数のコマンドとパイプを必要とする)が望ましいのはfind何ですか?
HalosGhost 14年

簡潔で読みやすく、lsコマンドの規則に従っています。findコマンドの引数よりも覚えやすいと思います。それぞれ独自のオプションと賞賛のために!
tkjef 16

0

lsパイプとパイプを使って試してみましょう:

ls  -l --hide='t_*'  uploads/ | grep -v ^d | tr -s ' ' | cut -d ' ' -f 9

最後の列が9番目の列であるとします。


1
スペースを含むファイルがある場合はどうなりますか?
ヨルダン

0

findの-maxdepth移植性の問題が懸念される場合は、次を使用できます。

ls -l uploads/ | awk '/^-/ && $9 !~/^t_/ {print $9}'

私は専門家ではありませんが、これでうまくいくと思います。私はそれが少し不可解に見えると思いますが、もしあなたがawkを話すなら、それは本当にそうではありません。$ 9の代わりに$ NFを使用できます。次のこともできます。

ls -l uploads/ | awk '/^-/' | awk '!/^t_/ {print $9}'

これは同じことを行います(ただし、おそらく前者よりも効率的ではありません???)。

実際、他の投稿について考えた後、次のようになります

ls -l --hide=t_* uploads/ | awk '/^-/ {print $9}'

さらに短く明確な方法です。

私が間違っている場合、誰かが私を修正してください。:-)


解析lsは一般に良いアイデアではありません。たとえば、ファイル名に空白文字が含まれていると、awkのトリックは失敗します。
マット

@mat-修正していただきありがとうございます。あなた(およびjw013)が指摘した記事を読んだ後、正しいファイル名を出力するためにlsを信頼できないことがわかりました。awkコードを書き直して$ 9から行末まで(空白を含めるため)をすべて印刷する場合でも、このls出力はまだ間違っている可能性があります。これは期待はずれであり、IMOを修正する必要があります。再度、感謝します。
kkaszub


-1

このエイリアスを試して使用してください:

alias l='ls -hLlF'

ls -hLlFはサブディレクトリを表示し、で始まるファイルを表示しますt_。では、これは質問にどのように答えますか?
ラファエルアーレンス

おそらく私は質問を誤解したでしょう。ls -hLlFは、リンクされたディレクトリのターゲットディレクトリを表示しません。
グラニュラー

そうそう。しかし、あなたは質問の他の答えを読んでいませんか?
ラファエルアーレンス

-1

簡単です:

ls -l --hide 't_*' <absolute path to desired directory> | grep -v ^d


(1)この答えはとても簡単です、以前に与えられました。(2)ディレクトリへのフルパスを指定する必要があると思われるのはなぜですか?
スコット

@Scott-これは、解決策を得るための非常に迅速かつ簡単な方法です。答えを普遍的にするためにフルパスが指定されました
ディガー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.