Назад | Перейти на главную страницу

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

Существуют ли какие-либо инструменты Linux / Unix, которые находят все файлы в одном каталоге, отсутствующие в другом? В основном я ищу diff, который работает с выводом ls.

Также приветствуются короткие и приятные сценарии.

diff уже делает это:

diff dir1 dir2

Пример вывода:

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

Баш:

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

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

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

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

С уважением

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

diff --brief -r dir1/ dir2/

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

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

Это работает..

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

непроверенный:

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

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