あるフォルダ内のすべてのファイルが別のフォルダにあることを確認する

あるフォルダ内のすべてのファイルが別のフォルダにあることを確認する

aデフォルトでは、複数のイメージを含むディレクトリがあります。さて、これらすべての画像がディレクトリにあることを確認したいと思いますb。要点は、多くのイメージがbサブディレクトリに直接存在するのではなく、bサブディレクトリ内にあることです。

また、ファイル名に依存せずにファイルの内容に依存したいと思います。

(bashタグのため:私はbashの答えを好みますが、他の言語でも別のプログラムを使用していても大丈夫です)

答え1

内容別に比較したいので、ハッシュを利用した方が良いようです。

findこのコマンドを使用して、ディレクトリのファイルパスのリストを取得できます。この-type fオプションはすべてのディレクトリを無視し、通常ファイルの出力パスのみを無視します。このオプションは、見つかったパスを取得し、md5ハッシュリスト+ファイルパス( 'md5_hash /path/to/file')に変換する-exec md5sum {} \;コマンドに提供します。md5sum

cutこのリストをコマンドにパイプします。最初のオプションは、-f 1最初の列(ハッシュ値)のみを使用するように指示します。 2 番目は、列間-d ' 'の区切り文字として空白文字を使用するように指示します。デフォルトはタブです。

簡単にするために、対応するハッシュリストをソートコマンドにリンクしますdiff

演算子<( command )が呼び出されますプロセスの交換。コマンドの出力を取得し、それを入力として要求するコマンドの擬似ファイルに変換します(簡単な説明を見るにはリンクに従ってください)。これにより、diff2つのファイルを比較したいようです。

:~$ diff <(find folder1/ -type f -exec md5sum {} \; | cut -f 1 -d ' ' | sort) \
    <(find folder2/ -type f -exec md5sum {} \; | cut -f 1 -d ' ' | sort)

注:フォルダ1/とフォルダ2/を実際のフォルダに置き換えることを忘れないでください。

これにより、そのうちの1つにのみ存在するファイルのmd5ハッシュリストが表示されます。

実際に欠落しているファイルを知りたい場合は、次のことができます。

:~$ find folder1/ -type f -exec md5sum {} \; | sort | grep my_md5_hash

確認するファイルが多い場合は、<(find ...)次のように両方のコマンドの結果を保存して比較することをお勧めします。

:~$ diff list1.txt list2.txt
:~$ cat list1.txt | grep my_md5_hash

答え2

回答を見る同様の質問については2週間前から。

find . -type f -exec md5sum {} + | sort | sed 's/  */!/1' | awk -F\| 'BEGIN{first=1}{if($1==lastid){if(first){first=0;print lastid, lastfile}print$1, $2} else first=1; lastid=$1;lastfile=$2}'

答え3

*.jpg ファイルであるとし、次のようにします。

既存のファイルを見つけるには:

grep -Ff <(for i in </path/to/directory/a>/*.jpg ; do md5sum $i | awk {'print $1'}; done) <(find </path/to/directoryb/ -iname "*.jpg" | xargs md5sum)

ここで、ループはfor「a」ディレクトリ内のすべてのファイルのmd5チェックサムリストを生成し、ここでは「b」ディレクトリ(下のディレクトリを含む)のすべてのファイルのmd5チェックサムリストを生成します。*.jpgfind*.jpg

2つのリストが比較され、grep -fF完全なコマンドは2つの出力列を生成します。最初の列は存在するファイルのmd5チェックサムで、2番目の列は 'b'ディレクトリにある一致するファイルのファイル名(フルパスを含む)です。 。| awk {'print $2'}ファイル名のみを取得するには、追加を使用できます。

存在しないファイルを見つけるには:

grep -vFf <(for i in </path/to/directory/a>/*.jpg ; do md5sum $i | awk {'print $1'}; done) <(find </path/to/directoryb/ -iname "*.jpg" | xargs md5sum)

最初のgrepコマンドと同じ操作を実行しますが、この-vオプションを使用して一致しないコンテンツのみを一覧表示します。

何を探していますか:

"a"ディレクトリにすべてのファイルが存在する場合、2番目のgrepは出力を返さないでください。

*.jpgを検索したい拡張子に置き換えてください。

manページからgrep

   -f FILE, --file=FILE
          Obtain patterns from FILE, one per line.  The empty file contains zero patterns, and therefore matches nothing.
          (-f is specified by POSIX.)

    -F, --fixed-strings
          Interpret PATTERN as a list of fixed strings, separated by newlines, any of which is to  be  matched.   (-F  is
          specified by POSIX.)

-v, --invert-match
              Invert the sense of matching, to select non-matching lines. 

関連情報