web-dev-qa-db-ja.com

ファイルリスト内のファイルが特定のディレクトリに存在するかどうかを確認する

実行時の引数は次のとおりです。$ 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ディレクトリに存在することを確認する方法を知りません。

6
user29772

ファイル内の行を反復処理する最良の方法は、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"
6
jordanm

シェルの方法、あなたはそれを書くでしょう:

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

(ksh、zsh、bashなどのプロセス置換をサポートするシェルを想定)

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

  1. 最初のファイルのみの行
  2. 2番目のファイルの行のみ
  3. 両方のファイルに共通の行

そして、あなたは-1-2-3対応する列を削除するオプション。

したがって、上記では最初の列のみがレポートされます。ファイルリストにある行で、lsの出力にはない行です(lsはデフォルトでファイルリストを並べ替えます。ファイルはそこにある名前には改行文字は含まれません)。

9
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
0
Hugo