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