重複の可能性:
nix/linuxシェルでパターンマッチングを行うときに逆ワイルドカードまたは負のワイルドカードを使用するにはどうすればよいですか?
man
のls
ページを読みましたが、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]
sed
、awk
、およびgrep
の使い方を本当に学ぶ必要がありますが、正規表現の書き方を理解するのに行き詰まっています。正規表現の概念は明確に理解していますが、異なる構文を使用する正規表現間で混乱します。
どんな助けでも大歓迎です!
編集:
私はMacOS Xを実行していることを忘れたので、関数はunix/linuxシェルの他の回答で説明されているものとわずかに異なる可能性があります(したがって、sed
、awk
、およびgrep
)。
多分このコマンドはあなたを助けるでしょう
find ./ -maxdepth 1 ! -path "*txt"
これはあなたを助けるかもしれません
ls --ignore=*.txt
ディレクトリ内の.txtファイルは表示されません。
ls|grep -v ".txt"
これは役に立ちますか?
ls提示される引数をリストするだけです。 *.txt
はa.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。
find
を使用する1つの方法:
find . -maxdepth 1 -type f -not -name "*.txt" -printf "%f\n"