ファイルリストのファイルがディレクトリに存在することを確認する

ファイルリストのファイルがディレクトリに存在することを確認する

ランタイムパラメータは次のとおりです。$ 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%/}/")

(シェルがksh、zsh、bashなどのプロセス置換をサポートしていると仮定)

comm2つのソートされたファイル間の共通行を報告するコマンド。タブで区切られた3つの列に表示されます。

  1. 最初のファイルの行のみ
  2. 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

ファイルの行を繰り返す最善の方法は、readwhileループに組み込まれた関数を使用することです。これがあなたが探しているものです:

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

関連情報