ls *.csv --ignore="*pattern*" "パターン"を含むファイルを返します。

ls *.csv --ignore=

なぜ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ソリューションを提供するだけです。)

おすすめ記事