Files

ls *.csv –ignore=’pattern’ 返回包含“pattern”的文件

  • August 12, 2020

為什麼不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解決方案。)

引用自:https://unix.stackexchange.com/questions/401180