ファイル名の指定された文字列と一致しないファイルを一覧表示する


15

名前の付いた多数のファイル(約200)が、temp_log.$$確認する必要のある他のいくつかの重要なファイルとともに作成されるディレクトリがあります。

すべてのファイルを簡単にリストし、temp_log.$$表示されないようにファイルを除外するにはどうすればよいですか?

期待される出力

$ ls -lrt <exclude-filename-part>
-- Lists files not matching the above given string

私はlsマニュアルページを調べましたが、このリファレンスには何も見つかりませんでした。ここで重要な情報を見逃した場合はお知らせください。

ありがとう


BASHでは、動作するls --hide='temp_log.$$'はずです。用語全体のどの部分であるかに応じて、ワイルドカードを使用してこれを拡張することもできtemp_log.$$ます。
エルチ

回答:


23

GNU ls(非組み込みLinuxおよびCygwinのバージョンであり、他の場所でも見つかる場合があります)を使用すると、ディレクトリをリストするときに一部のファイルを除外できます。

ls -I 'temp_log.*' -lrt

(の長い形式は-Iです--ignore='temp_log.*'

zshを使用すると、シェルにフィルタリングを実行させることができます。峠-dlsマッチしたディレクトリの内容を一覧避けるように。

setopt extended_glob          # put this in your .zshrc
ls -dltr ^temp_log.*

ksh、bash、またはzshでは、kshフィルター構文を使用できます。zshで、setopt ksh_glob最初に実行します。bashでは、shopt -s extglob最初に実行します。

ls -dltr !(temp_log.*)

GNU lsの例では、単一引用符ではありません。ls-I 'temp_log。*' -lrtコマンドにパターンを渡し、シェルに展開させないために必要です。
shargors

Ubuntuのバッシュv4.3.48では、それがあるべき-Itemp_log.*後に隙間なく-I
ヤン王殷

1
@YanKingYinいいえ、の後にスペースを入れても構いません-I。ただし、*何らかの方法で引用する必要があります。-I temp_log.*動作しませんが-I 'temp_log.*'-I "temp_log.*"-I temp_log.\*、など細かいです。
ジル「SO-悪であるのをやめる」

10

grepオプションとともに使用できます-v

ls -lrt | grep -v <exclude-filename-part>

1
なぜこれがダウン投票されたのかわからない、それは正しい答えです。
ティムケネディ

5
ls出力でgrepを実行することは常に正しいとは限らず、推奨されません。副作用があります。正確な問題を思い出すことができません。サイドノート-反対票は私からではありません;)
mtk


3

findこれに使用できます:

find . \! -name 'temp_log*'

これは単に名前を出力するだけで、タイムスタンプとパーミッションを付け-lsls -lスタイル出力を作成したり-exec ls {} +、列、ソートなどに必要なオプションを使用して実際にlsに渡すために追加できます。

これはディレクトリ内の単なるファイルであると仮定して、これを書きました。ディレクトリに他のディレクトリが含まれている場合、再帰的にリストすることを避けたい場合があります

find . \! -name 'temp_log*' -maxdepth 1

また、lsを使用する場合は、-dオプションを渡して、ディレクトリ内にリストしないようします。-exec ls -d {} +


おそらく-maxdepth 1同様に非再帰を模倣したいls
jw013

いいね 最小限のPOSIX findを使用していないユーザーは、-maxdepth こちらをご覧ください
ワイルドカード

2

の機能ではなく、シェルの機能を使用したいと思いますls。私はbashを使用しているので、あなたが欲しいものをチェックしましたman bash。「^ EXPANSION」を検索します(最初に「/」を押します)。抜粋:

拡張

    展開は、コマンドラインが単語に分割された後に実行されます。実行される展開にはブレース展開チルダ展開パラメータおよび変数展開コマンド置換算術展開単語分割、およびパス名展開の 7種類があり ます

   ︙
... <snip> ...
   ︙

パス名展開

    しない限り、単語の分割後、-fオプションが設定されている、bashは文字の各単語をスキャンし*?、と[。これらの文字のいずれかが表示される場合、単語はパターンと見なされ、パターンに一致するファイル名のアルファベット順にソートされたリストに置き換えられます。…

私は最近、最初の文字に基づいて、次のようなコマンドでファイルを除外し始めました:

$ ls ./[^t]*

これは文字で始まらないものにマッチしtます。大括弧の間にさらに文字を追加すると、それらの文字で始まるファイルも除外されます。

リンクを探して、私は良いものを持っています!パターンマッチングを参照してください。そこから、これはあなたの場合に機能します:

$ ls -lrt ./!(temp_log.*)

これには、Gillesが述べているようにextglobshopt組み込み(shopt -s extglob)を使用してシェルオプションを有効にする必要があります。


-1

ただやる

ls -ltr `grep -il patterntosearch  *`

grepファイル名ではなく、ファイル内のパターンを検索します。
evilsoup

-2

ファイル以来、あなたはそれをDONTに印刷したい「temp_log」を持っています ファイル名に、grepで除外します。

ls -lrt | grep -v "temp_log."

注:ユーザーがgrepが検索する文字列の周りに引用符 ""を含めなかったため、同様の回答を含む他の投稿はおそらくダウン投票されました。引用符がないと、宣伝どおりに機能しません。


あなたの「メモ」は厳密には正しくありません。引用する必要があるかもしれない特定の文字がありますが、私はその特定の文字列に何かがあるとは思いません。
smokes2345

「temp_log」という名前のユーザーまたはグループがありますまで(正規表現のドットは、スペースか何か以下にマッチしますtemp_log。これは、除外することは良い(一般的な)方法ではありません。ls結果を。
ジェフ・シャラー

のみ-F、@ smokes2345; ピリオドは、基本的な正規表現の任意の文字と一致します。参照:unix.stackexchange.com/q/119905/117549
ジェフシャラー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.