检查文件列表中的文件是否存在于某个目录下

检查文件列表中的文件是否存在于某个目录下

运行时参数如下: $1 是包含文件列表的文件的路径 $2 是包含文件的目录的路径 我想要做的是检查 $1 中列出的每个文件是否存在于 $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目录中。

答案1

贝壳方式,你会这样写:

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}

答案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"

答案3

echo "Inquire if each file of a file list exists in a specific directory"
foundc=0
nfoundc=0
fflist=""
nflist=""
DIR_A='./my_directory'  # address directory used as target of searching
FILELIST='./file_list.txt' # file with: list of file names to search

### echo "for file in $FILELIST"
exec 3< $FILELIST  # associa lista_arquivos ao descritor 3
while read file_a <&3; do
    if [[ -s "$DIR_A/${file_a}" ]];then    # file is found and is > 0 bytes.
        foundc=$((foundc + 1)) 
        fflist=" ${fflist} ${file_a}"
        ## echo '...file ' "${file_a}" 'was found...'   
    else                          # file is not found or is 0 bytes
        nfoundc=$((nfoundc + 1)) 
        nflist=" ${nflist} ${file_a}"
       echo '...file ' "${file_a}" 'was not found...'
    fi
done

exec 3<&-  # libera descritor 3
echo "List of found files: "     "${fflist}" "
echo "List of NOT found files: " "${nflist}" "
echo "Number of files in "[$FILELIST]" found     =  [${foundc}]  "
echo "Number of files in "[$FILELIST]" NOT found =  [${nfoundc}] "

exit

相关内容