web-dev-qa-db-ja.com

lsを使用して、パターンに一致しないすべてのファイルを一覧表示します

重複の可能性:
nix/linuxシェルでパターンマッチングを行うときに逆ワイルドカードまたは負のワイルドカードを使用するにはどうすればよいですか?

manlsページを読みましたが、notをすべてリストするオプションが見つかりません。 -)ファイルセレクターと一致します。この操作を実行する方法を知っていますか?

例:私のディレクトリがこれだとしましょう:

> ls
a.txt b.mkv c.txt d.mp3 e.flv

今、私は次のことをする何かをしたいと思います

> ls -[SOME_OPTION] *.txt
b.mkv d.mp3 e.flv

そのようなオプションはありますか?

そうでない場合は、lsの出力を別の関数(おそらくsed)にパイプして、必要な関数だけを表示する方法はありますか?

これを行う方法は正確にはわかりませんが、次のようになると思います。

> ls | sed [SOMETHING] 

sedawk、およびgrepの使い方を本当に学ぶ必要がありますが、正規表現の書き方を理解するのに行き詰まっています。正規表現の概念は明確に理解していますが、異なる構文を使用する正規表現間で混乱します。

どんな助けでも大歓迎です!

編集:

私はMacOS Xを実行していることを忘れたので、関数はunix/linuxシェルの他の回答で説明されているものとわずかに異なる可能性があります(したがって、sedawk、およびgrep)。

12
Kaushik Shankar

多分このコマンドはあなたを助けるでしょう

find ./ -maxdepth 1 ! -path "*txt"
18
Robert Guo

これはあなたを助けるかもしれません

ls --ignore=*.txt

ディレクトリ内の.txtファイルは表示されません。

45
Mani R
ls|grep -v ".txt"

これは役に立ちますか?

14
nav_jan

ls提示される引数をリストするだけです。 *.txta.txt c.txtに展開されてからlsが表示されます。echo *.txtを試してください。

sedで要求したことを実行するには、入力からパターンを削除できます。次に例を示します。

ls | sed '/\.txt$/d'

.txtで終わるすべての行を削除します。

bashおよびzshを使用すると、シェルに逆展開を実行させることができます。bashを使用すると、次のようになります。

ls !(*.txt)

zsh:

ls *~*.txt

両方のシェルで拡張globオプションを有効にする必要があることに注意してください。shopt -s extglob with bashおよびsetopt extendedglob with zsh

6
Thor

findを使用する1つの方法:

find . -maxdepth 1 -type f -not -name "*.txt" -printf "%f\n"
3
Steve