パターンに一致するファイルをリストしますが、別のパターンに一致するファイルを無視しますか?


12

ファイルa1、a2、a3、b1、b2、b3があるディレクトリがあるとします。で始まるがa、含まないファイルのみを照合したい3。試しls -I "*3" *a*ましたがa1 a2 a3、一致させたくありませんが、戻りますa3。これは可能lsですか?


ここでは興味深い多様な回答がありますが、なぜls -I '* 3' a *が失敗するのかを説明するとわかりやすくなります。および/またはなぜシェルのグロブリストがlsへの無視スイッチによってその後フィルタリングされないのですか?
テオプラスタス

マニュアルページには-Iオプションに関するdo not list implied entries matching shell PATTERN説明がありますが、暗黙の意味を説明していませんlsが、グロブ展開によって取得されるファイルにのみ適用されると推測しています-そして、シェルはそれをls展開しませんa*
マレージェンセン

回答:


14

ただ:

shopt -s extglob  
ls a!(*3*)
  • shopt -s extglob 拡張グロビングをアクティブにします。
  • a 開始と一致 a
  • !()()... 内の一致を否定します
    • *3*これ3とその前後のすべて。

$ touch 1 2 3 a1 a2 a3 b1 b2 b3 aa1 aa2 aa3 a2a a3a
$ ls a!(*3*)
a1  a2  a2a  aa1  aa2

1
参考までに、必要なものset -s extglob
ブライアン

@ブライアン・イア、ちょうど気づいた^^
カオス

8

既存の回答は、これをグロブで行う最良の方法をよく述べています。ほとんどの場合、findスクリプトを作成したり、さらに処理したい場合は、より良いオプションであるため、これを含めます。

$ find . -maxdepth 1 -name 'a*' -not -name '*3*'
./a1
./a2

回答をフィードしてxargs、簡単なアクションを実行したり、while readループを使用してより複雑なことを実行したりできます。


4

簡単な方法は

  • 一致するすべてのファイルをリストする a*
  • 次に、を含むすべての行を削除します 3

UNIXコマンドは

ls -1 a* | grep -v 3

ls -1 1行に1つのファイルを表示します。

grep通常、パターンに一致する行を見つけますが、-vこの動作では逆になります。つまり、grepはそのパターンに一致しない行を見つけます。


2
こんにちはピーター!ソリューションがどのように機能するかを、関連する限り詳細に説明するのが最善です。
dhag

2
解析lsはgoobのアイデアではありません:mywiki.wooledge.org/ParsingLs
chaos

3

zsh~ グロブ演算子を使用して:

setopt extendedglob
print -rl -- a*~*3*

次のgnu ls2つの--ignoreオプションを使用できます。

ls -I '[^a]*' -I '*3*'

1番目は、先頭にないすべてのファイル名をa無視し、2番目は、3

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.