実行時の引数は次のとおりです。$ 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
ディレクトリに存在することを確認する方法を知りません。
ファイル内の行を反復処理する最良の方法は、whileループでread
ビルトインを使用することです。これはあなたが探しているものです:
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"
シェルの方法、あなたはそれを書くでしょう:
comm -23 <(sort -u < "$1") <(ls -- "$2")
(ksh、zsh、bashなどのプロセス置換をサポートするシェルを想定)
comm
は、2つのソートされたファイル間の共通の行を報告するコマンドです。 3つのタブで区切られた列に表示されます。
そして、あなたは-1
、-2
、-3
対応する列を削除するオプション。
したがって、上記では最初の列のみがレポートされます。ファイルリストにある行で、ls
の出力にはない行です(ls
はデフォルトでファイルリストを並べ替えます。ファイルはそこにある名前には改行文字は含まれません)。
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