2つのディレクトリAとBがあり、それぞれに多くのサブディレクトリがあります。
geom001, geom002 ....etc
各サブディレクトリには、results.txtというファイルが含まれています。 AのすべてのファイルをBのすべてのファイルと開かずに比較し、Bの1つ以上のファイルに似たAのファイルが1つ以上あることを確認したいと思います。次のコマンドを使用してaのすべてのファイルを繰り返すにはどうすればよいですか?
cmp --silent file1 file2 || echo "file1 and file2 are different"
答え1
ファイルが同じ場合、md5sum
sもまったく同じなので、次のように使用できます。
find A/ B/ -type f -exec md5sum {} + | sort | uniq -w32 -D
md5sumの長さは常に128ビット(または16バイトまたは32個の16進数)で、md5sum
プログラム出力では16進数を使用します。したがって、コマンド-w32
のオプションを使用して、各行uniq
の最初の32文字のみを比較します。
これは印刷されますみんな一意でないmd5sumを持つファイル。つまり繰り返し。
注:これは、A /またはB /の場所に関係なく重複ファイルを検出するため、/A/subdir1/file
およびA/subdir2/otherfile
が等しい場合は印刷を続けます。重複したコンテンツが複数ある場合は、すべて印刷されます。
awk '{print $2}'
たとえば、またはまたはcut
などを使用して、出力からmd5sumをパイプすることができます。sed
処理にさらに使用できるように連想配列(別名「ハッシュ」)に便利なキーなので、出力に残しておきます。awk
perl
答え2
私はこれがあなたをより近づけると思います。 A には、results という名前のすべてのファイルと B に、results という名前のすべてのファイルの cmp 出力が一覧表示されます。
find ./A -name results | xargs -I REPLACESTR find ./B -name results -exec cmp REPLACESTR {} \;
答え3
質問/要求の明らかな問題は再帰的な側面かもしれません。
これが十分なユーティリティであり、比較されるフォルダ/ディレクトリがcmp
同じ構造(つまり同じファイルとフォルダ)を持ち、同じルートパスにあると仮定すると、次のように試すことができます。1
2
#!/bin/bash
ROOT=$PWD ; # #// change to absolute path eg: /home/aphorise/my_files
PWD1="1/*" ;
PWD2="2/*" ;
# #// Get lengths of seperators
IFS=/ read -a DP <<< ${ROOT} ;
PLEN1=${#DP[*]} ;
IFS=/ read -a DP <<< ${PWD1} ;
PLEN1=$(echo "${#DP[*]}" + $PLEN1 - 1 | bc) ;
IFS=/ read -a DP <<< ${PWD2} ;
PLEN2=${#DP[*]} ;
# #// Set absolute paths:
PWD1="${ROOT}/${PWD1}" ;
PWD2="${ROOT}/${PWD2}" ;
DIFFS=0 ;
function RECURSE()
{
for A_FILE in $1 ; do
if [ -d $A_FILE ] ; then
RECURSE "$A_FILE/*" ;
else
IFS=/ read -a FP <<< ${A_FILE} ;
B_FILE="${PWD2:0:${#PWD2}-${#PLEN2}}$( IFS=/ ; printf "%s" "${FP[*]:$PLEN1:512}"; )" ;
if ! cmp ${A_FILE} ${B_FILE} 1>/dev/null ; then printf "$A_FILE --> $B_FILE <-- DIFFER.\n" ; ((++DIFFS)) ; fi ;
fi ;
done ;
}
printf "Starting comparison on $PWD1 @ $(date)\n\n" ;
RECURSE "${PWD1[*]}" ;
if ((DIFFS != 0)) ; then printf "\n= $DIFFS <= differences detected.\n" ; fi ;
printf "\nCompleted comparison @ $(date)\n" ;
修正する:
以下は、追加のフィードバックを受け取った後に無条件ディレクトリのすべてのファイルを次のものと1
比較する別のスクリプトです2
。
#!/bin/bash
PWD1="$PWD/1/*" ;
PWD2="$PWD/2/*" ;
DIFFS=0 ;
NODIFFS=0 ;
printf "Starting comparison on $PWD1 @ $(date)\n\n" ;
FILES_A=$(find ${PWD1} -type f) ;
FILES_B=$(find ${PWD2} -type f) ;
for A_FILE in ${FILES_A[*]} ; do
for B_FILE in ${FILES_B[*]} ; do
if ! cmp ${A_FILE} ${B_FILE} 1>/dev/null ; then
printf "$A_FILE & $B_FILE <- DIFFER.\n" ;
((++DIFFS)) ;
else
printf "\n-> SAME: $A_FILE & $B_FILE\n" ;
((++NODIFFS)) ;
fi ;
done ;
done ;
printf "\n= $DIFFS <= differences detected - & - $NODIFFS <= exact matches.\n" ;
printf "\nCompleted comparison @ $(date)\n" ;