Home > bash > Check whether files in a file list exist in a certain directory

Check whether files in a file list exist in a certain directory

January 5Hits:1

The runtime arguments are as follows: $1 is the path to the file containing the list of files $2 is the path to the directory containing the files What I want to do is check that each file listed in $1 exists in the $2 directory

I'm thinking something like:

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 

As you can see, I want it so that if any of the files listed in $1 don't exist in the directory $2, the script states this then closes. The only part I can't get my head around is the (FILEEXISTSIN$2DIRECTORY) part. I know that you can do [ -e $f ] but I don't know how you can make sure its checking that it exists in the $2 directory. Thank you, I hope you can help this bash noob out.


The best way to iterate over the lines in a file is using the read builtin in a while loop. This is what you are looking for:

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

The shell way, you'd write it:

comm -23 <(sort -u < "$1") <(ls -- "$2")

(assuming a shell with support for process substitution like ksh, zsh or bash)

echo "Inquire if each file of a file list exists in a specific directory"
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...'

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}] "


Related Articles

Copyright (C) 2017 ceus-now.com, All Rights Reserved. webmaster#ceus-now.com 14 q. 1.300 s.