ls *.csv –ignore=’pattern’ 返回包含“pattern”的文件
為什麼不
ls --ignore
忽略模式?看下面的例子:
mkdir books cd books touch books_abby.csv touch books_karen.csv touch books_david.csv touch books_tom.csv
這將創建四個文件:
$ 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
該標誌在
ls
手冊頁中描述如下 (重點是我的) ……不列出與 shell PATTERN 匹配的隱含條目
手冊頁沒有太多關於“暗示”的內容,那麼它到底是什麼意思?隱含條目(文件、目錄等)是
ls
無需您明確提供與該條目匹配的參數即可返回的條目。匹配項可以是條目的實際名稱(ls books_tom.csv ...
使用您的範例),也可以是與其匹配的全域變數(ls *tom.csv
例如)。將此達到其邏輯極限,如果您
ls
不帶參數呼叫,則返回的所有內容都是隱含的!我假設最常見的用法--ignore
是這樣一個ls
簡單的呼叫,因為它是執行“列出除 X 之外的所有內容”操作的最簡單方法……至少如果你想避免使用任何其他命令。所以,讓我們看看你的命令。通過
ls *.csv --ignore="*tom*"
匹配模式明確引用“books_tom.csv”*.csv
。使用ls --ignore="*tom*"
,根據上一段,目錄中的所有內容都是隱含的,因此不會顯示“books_tom.csv”。如果您在 shell 中提供了擴展的 globbing(您可以使用 bash 啟用
shopt -s extglob
),您可以通過製作一個排除“tom”的模式來實現您想要的。例如ls books_!(tom).csv
會顯示books_abby.csv
但不顯示books_tom.csv
。(當然,您可以使用其他工具
find
,例如 pipe togrep -v
等…我只是給出一個純粹的ls
解決方案。)