Существуют ли какие-либо инструменты для Linux / Unix, которые находят все файлы в одном каталоге, а не в другом? В основном я ищу diff, который работает на выходе ls.
Короткие и сладкие сценарии также приветствуются.
Существуют ли какие-либо инструменты для 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
Bash:
diff <(cd dir1; ls) <(cd dir2; ls)
Сравните только имена файлов, а не содержимое файлов.
ls, используйте findвместо этого!
Как люди говорили вам здесь, вы можете использовать DIFF в различных вариантах использования. Или вы просто используете dirdiffвместо этого, что предназначено для того, что вы пытаетесь! :-)
Но если вы хотите синхронизировать некоторые каталоги, вам действительно стоит взглянуть на них rsync.
С уважением
Если вы хотите сделать это через все подкаталоги, хороший способ сделать это:
diff --brief -r dir1/ dir2/
Я предпочитаю использовать краткое, но вы можете оставить это, если хотите.
Это работает..
ls -a1 /dir1 | sort > /tmp/1
ls -a1 /dir2 | sort > /tmp/2
diff /tmp/1 /tmp/2
У Денниса Уильямсона был хороший ответ , но мне нужно было сделать это рекурсивно. 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 не должны содержать завершающий слеш.
diff dir1 dir2 | grep "Only"