Bash

檢查文件列表中的文件是否存在於某個目錄中

  • August 27, 2021

執行時參數如下: $ 1 is the path to the file containing the list of files $ 2 是包含文件的目錄的路徑我想要做的是檢查列出的每個文件 $ 1 exists in the $ 2 目錄

我在想類似的事情:

for f in 'cat $1'
do
if (FILEEXISTSIN$2DIRECTORY)
then echo '$f exists in $2'
else echo '$f is missing in $2' sleep 5 exit
fi
done

如您所見,我想要它,以便如果目錄中$1不存在列出的任何文件$2,則腳本會聲明它然後關閉。唯一讓我無法理解的部分是這個(FILEEXISTSIN$2DIRECTORY)部分。我知道你可以這樣做,[ -e $f ]但我不知道你如何確保它檢查它是否存在於$2目錄中。

遍歷文件中的行的最佳方法是read在 while 循環中使用內置函式。這就是您要查找的內容:

while IFS= read -r f; do
   if [[ -e $2/$f ]]; then
       printf '%s exists in %s\n' "$f" "$2"
   else
       printf '%s is missing in %s\n' "$f" "$2"
       exit 1
   fi
done < "$1"

shell方式,你會寫它:

comm -23 <(sort -u < "$1") <(ls -A -- "${2%/}/")

(假設 shell 支持程序替換,如 ksh、zsh 或 bash)

comm是報告兩個排序文件之間的公共行的命令。它顯示在 3 個製表符分隔的列中:

  1. 僅在第一個文件中的行
  2. 僅在第二個文件中的行
  3. 兩個文件共有的行

並且您可以通過-1-2-3選項來刪除相應的列。

所以上面,它只會報告第一列:文件列表中的行,而不是lsls預設情況下對文件列表進行排序,我們假設其中的文件名不包含換行符)的輸出。


zsh中,您將使用其${A:|B} 數組減法運算符:

#! /bin/zsh -
files_in_list=(${(f)"$(<$1)"})
files_in_dir=(${2%/}/*(ND:t))
print -rC1 -- ${files_in_list:|files_in_dir}

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