1400のサブフォルダを含むフォルダと1.399のサブフォルダを含むフォルダを比較しようとしています。どのサブフォルダが欠落しているかを知る必要があります。
私はこれを試しました:
diff -rq dir1/ dir2/ | grep dir1/ | awk '{print $4}' > difference1.txt
しかし、6時間が経過してもまだ出力はありません。ls
フォルダではほぼ即時なので、diffよりも高速な方法はありますか?
答え1
diff -u <(ls dir1) <(ls dir2)
これにより、diff
サブディレクトリの内部を表示できなくなります。
それとも勇敢であればこれを試してみてください。)
diff -u <(find dir1/ -maxdepth 1 -type d -exec basename {} \;) <(find dir2/ -maxdepth 1 -type d -exec basename {} \;)
答え2
の場合、これは非常に簡単な作業ですrsync
。
rsync -n -av dir1/ dir2/ | grep '/$' | grep -Fvx './'
rsync
これにより、dir1
ing intoの内容をテストし、dir2
最上位ディレクトリ自体を除いてスラッシュで終わる行(ディレクトリ)のみを表示します。
以下は簡単なテスト/デモです。
$ # create 1500 folders in dir1:
$ for i in $(jot -w %04d 1500); do mkdir -p dir1/dir-$i; done
$ # clone dir1 to dir2, then remove one directory:
$ rsync -a dir1/ dir2/
$ rmdir dir2/dir-0749/
$ # rsync -n will tell you which one is missing:
$ time rsync -n -av dir1/ dir2/ | grep '/$' | grep -Fvx './'
dir-0749/
real 0m0.038s
user 0m0.001s
sys 0m0.041s
dir1
欠落しているが存在するフォルダを確認するためにこの手法を採用するには、次のオプションをdir2
使用します。rsync
--delete
$ rmdir dir1/dir-0479/
$ time rsync -nav --delete dir1/ dir2/ | grep '/$' | grep -Fvx './'
deleting dir-0479/
dir-0749/
この行は行くにはありませんが、そこにあることをdeleting ...
伝えます。dir-0479
dir1
dir2
答え3
試してみてください
ls dir1 > file1; ls dir2 > file2; diff file1 file2
あるいは、サブディレクトリの最も便利な方法であるvimdiffとtreeがある場合に使用できます。
tree dir1 > file1; tree dir2 > fiel2; vimdiff file1 file2
しかし、lsを実行することは目的のツリーよりはるかに高速です。
たとえば、違いがdir1のサブディレクトリにある場合です。
dir1
- dir2
- dir3
- dir4
vs
dir2
- dir2
- dir3
あなたはする必要があります
ls -R dir1 > file1; ls -R dir2 > file2; vimdiff file1 file2
答え4
diff <(ツリー-d dir_A) <(ツリー-d dir_B)