
なぜls --ignore
パターンを無視しないのですか?
次の例を見てください。
mkdir books
cd books
touch books_abby.csv
touch books_karen.csv
touch books_david.csv
touch books_tom.csv
これにより、次の4つのファイルが作成されます。
$ ls
books_abby.csv books_david.csv books_karen.csv books_tom.csv
ただし、「tom」を含むすべてのファイル名を無視して一覧表示したい場合でも、次のbooks_tom.csv
ものが返されます。
$ ls *.csv --ignore="*tom*"
books_abby.csv books_david.csv books_karen.csv books_tom.csv
予想される結果は、「tom」を含むファイルが省略されることです。
$ ls *.csv --ignore="*tom*"
books_abby.csv books_david.csv books_karen.csv
答え1
フラグは、ls
マニュアルページに次のように記述されています。(強調は私のもの)...
リストにない暗黙的にシェルパターンに一致する項目
マニュアルページには「暗黙的」の内容はあまり記載されていません。それでは、これは正確に何を意味しますか?暗黙的な項目(ファイル、ディレクトリなど)は、そのls
項目に一致するパラメータを明示的に指定しない場合に返される項目です。一致は、項目の実際の名前(ls books_tom.csv ...
例を使用して)でも、一致するglob(ls *tom.csv
たとえば)でもかまいません。
これを極端な論理的に考えてみると、ls
引数なしで呼び出すと返されたすべてが暗示的です!私は最も一般的な用途がこのような--ignore
素朴なls
呼び出しであると仮定します。これは、「X以外のすべての項目を一覧表示する」操作を実行する最も簡単な方法です。
それでは、あなたの命令を見てみましょう。ls *.csv --ignore="*tom*"
パターンを一致させて「books_tom.csv」への明示的な参照*.csv
。の場合、ls --ignore="*tom*"
前の段落によると、ディレクトリのすべての内容が暗示されるため、「books_tom.csv」は表示されません。
シェルで拡張ワイルドカードを使用できる場合(bashを介して有効にすることができますshopt -s extglob
)、「tom」を除くパターンを作成して必要なものを得ることができます。たとえば、表示されますがls books_!(tom).csv
表示books_abby.csv
されませんbooks_tom.csv
。
(もちろん、find
パイプラインgrep -v
などの他のツールを使用することもできます。私は純粋なls
ソリューションを提供するだけです。)