Find

顯示在 while 循環中不匹配的文件名

  • September 17, 2021

我有一個名為的文件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到該命令。

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