見つからないディレクトリを見つけるために2つのフォルダのls出力をどのように比較しますか?

見つからないディレクトリを見つけるために2つのフォルダのls出力をどのように比較しますか?

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これにより、dir1ing 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-0479dir1dir2

答え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)

関連情報