Знайдіть файли в одному каталозі, а не в іншому


12

Чи є інструменти Linux / Unix, які знаходять усі файли в одній директорії, відсутні в іншій? В основному я шукаю diff, який працює на виході ls.

Також вдячні короткі та солодкі сценарії.

Відповіді:


20

diff робить це вже:

diff dir1 dir2

Приклад виводу:

Only in dir1: some_file.txt
Only in dir1: some_other_file.txt
Only in dir2: third_file.txt

5
Це добре. Один захват: diff фактично працює на кожному з файлів, які є в обох. Чи є незрозумілий варіант просто протистояти іменам файлів (я, можливо, його пропустив)? В іншому випадку я пропонуюdiff dir1 dir2 | grep "Only"
Віллі Баллентін

Ух, це просто заощадить мені багато хвилин баш сценаріїв спасибі
user5359531

10

Bash:

diff <(cd dir1; ls) <(cd dir2; ls)

Порівняйте лише імена файлів - не вміст файлів.



використовувати rsync для синхронізації dirs
c4f4t0r

Не розбирайте ls, використовуйте findзамість цього!
val каже Відновити Моніку

4

Як люди, які вам тут казали, ви можете використовувати DIFF у різних варіантах використання. Або ви просто використовуєте dirdiffнатомість, що призначено для того, що ви намагаєтеся! :-)

Але якщо ви хочете синхронізувати деякі каталоги, то вам дійсно варто поглянути rsync.

З повагою


3

Якщо ви хочете це зробити і через усі підкаталоги, хороший спосіб це зробити:

diff --brief -r dir1/ dir2/

Я вважаю за краще використовувати короткий, але ви можете залишити це, якщо хочете.



0

Це працює ..

ls -a1 /dir1 | sort > /tmp/1
ls -a1 /dir2 | sort > /tmp/2
diff /tmp/1 /tmp/2

0

неперевірений:

find /dir/A -printf "%P" | while read f; do
  if [ ! -e "/dir/B/$f" ]; then
    echo $f
  fi
done

0

Денніс Вільямсон мав хорошу відповідь , але мені потрібно було це робити рекурсивно. GNU findutils 4.7.0 не сортує його вихід, тож ось що я використав

diff <(cd $dir1; find | sort) <(cd $dir2; find | sort)

Щоб зробити це лише одним способом і створити список файлів, я використав це:

diff <(cd $dir1; find | sort) <(cd $dir2; find | sort) \
| grep '< ./' | sed "s,< ./,$dir1/,"

Щоб це працювало належним чином, ні $ dir1, ні $ dir2 не повинні містити продільну косу рису.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.