Find
顯示在 while 循環中不匹配的文件名
我有一個名為的文件
files.txt
,其中包含一些文件名。我有一個命令可以讀取這個文件並執行 afind
以返回它找到的文件名。我想知道我該如何做相反的事情,我想要的是顯示它沒有找到的文件名。例子:
$ ls file1 file2 file3 files.txt $ cat files.txt file1 file2 file3 file4 $ while read x; do (find . -iname "$x"); done < files.txt ./file1 ./file2 ./file3
在此範例中,我希望它顯示
file4
在結果中,因為此文件名在 .txt 中,但在文件夾中不存在。
使用
grep
(對於目前文件夾中的文件,假設它們的名稱不包含換行符)):$ grep -v -i -F -x -f <(printf '%s\n' *) files.txt file4
選項:
-v
反轉匹配,選擇不匹配的行-f
printf '%s\n' *
列出目前目錄中的文件並用作grep
.-F
將模式解釋為固定字元串(而不是正則表達式)-x
匹配整行-i
不區分大小寫的匹配(比如你的-iname
)。
使用
find
:while IFS= read -r name; do if [ -z "$(find . -iname "$name")" ]; then printf 'Not found: %s\n' "$name" fi done <files.txt
此循環將一次從
files.txt
文件中讀取一個文件名,並將在目前目錄下的整個層次結構中搜尋該名稱,不區分大小寫。如果未找到名稱(find
不輸出任何內容),則會顯示一條消息。如果要確保該
find
命令僅查找正常文件(而不是目錄等),請添加-type f
到該命令。