Найти файлы в одном каталоге, а не в другом

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
tobym
источник
5
Это хорошо. Одно замечание: diff на самом деле работает с каждым из файлов в обоих. Есть ли какой-то непонятный вариант просто работать с именами файлов (возможно, я его пропустил)? В противном случае, я предлагаюdiff dir1 dir2 | grep "Only"
Вилли Баллентин
вау, это просто сэкономит мне много минут на скриптах bash, спасибо
user5359531
10

Bash:

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

Сравните только имена файлов, а не содержимое файлов.

Приостановлено до дальнейшего уведомления.
источник
Также кш и зш.
Приостановлено до дальнейшего уведомления.
используйте rsync для синхронизации
каталогов
Не разбирайте ls, используйте findвместо этого!
Вэл говорит восстановило Моника
4

Как люди говорили вам здесь, вы можете использовать DIFF в различных вариантах использования. Или вы просто используете dirdiffвместо этого, что предназначено для того, что вы пытаетесь! :-)

Но если вы хотите синхронизировать некоторые каталоги, вам действительно стоит взглянуть на них rsync.

С уважением

Январь
источник
3

Если вы хотите сделать это через все подкаталоги, хороший способ сделать это:

diff --brief -r dir1/ dir2/

Я предпочитаю использовать краткое, но вы можете оставить это, если хотите.

trueCamelType
источник
1

for i in $(ls -1 directory1); do if (test -f directory2/$i) then echo $i; fi; done

Джеймс Л
источник
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 не должны содержать завершающий слеш.

sondra.kinsey
источник