Bash
檢查文件列表中的文件是否存在於某個目錄中
執行時參數如下: $ 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
選項來刪除相應的列。所以上面,它只會報告第一列:文件列表中的行,而不是
ls
(ls
預設情況下對文件列表進行排序,我們假設其中的文件名不包含換行符)的輸出。在
zsh
中,您將使用其${A:|B}
數組減法運算符:#! /bin/zsh - files_in_list=(${(f)"$(<$1)"}) files_in_dir=(${2%/}/*(ND:t)) print -rC1 -- ${files_in_list:|files_in_dir}