Как сделать только дубликаты для разностной печати?

Я пытаюсь выяснить, какие файлы присутствуют в двух сравниваемых папках. Меня интересует только сравнение имен файлов.

Добавление -s к команде по какой-то причине не помогает. Я хочу повторно использовать список для удаления дубликатов, а удаление строк с надписью "Только в" - пустая трата времени.

Команда:

diff -s /folder1/folder1 /folder2/folder2

Выход:

Only in /folder1/folder1: sth.pdf
Only in /folder1/folder1: sth.png
Only in /folder1/folder1: sth.txt
Files /folder1/folder1/sthe.txt and /folder2/folder2/sthe.txt are identical
Only in /folder1/folder1: sth.pdf
Only in /folder1/folder1: sth.png
Only in /folder1/folder1: sth.txt
.
.
.

Какие-либо предложения?

1 ответ

Меня интересует только сравнение имен файлов.

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

Сейчас мне нужно сравнить имена файлов в двух каталогах и вывести только общие:

comm -12 <(cd dir1; stat -c '%n' *) <(cd dir2; stat -c '%n' *)
  • comm -12 <([...]) <([...]): будет сравнивать вывод [...] а также [...] выводить только строки, присутствующие в обоих файлах;
  • cd dirN; stat -c '%n' * изменит текущий рабочий каталог на dirN и вывести упорядоченный список имен файлов в нем.
% tree
.
├── dir1
│   ├── file1
│   ├── file2
│   └── file3
└── dir2
    └── file1

2 directories, 4 files
user@user-X550CL ~/tmp % comm -12 <(cd dir1; stat -c '%n' *) <(cd dir2; stat -c '%n' *)
file1

Если вам нужно работать с символами новой строки в именах файлов, используйте вместо этого:

sort -z <(cd dir1; stat --printf '%n\0' *) <(cd dir2; stat --printf '%n\0' *) | uniq -zd | tr '\0' '\n'
  • sort -z <([...]) <([...]): присоединится и отсортирует вывод [...] а также [...];
  • cd dirN; stat -c '%n' * изменит текущий рабочий каталог на dirN и вывести упорядоченный список имен файлов в нем;
  • uniq -zd: будет печатать только дубликаты строк;
  • tr '\0' '\n' заменит символы NUL символами новой строки.
% tree 
.
├── dir1
│   ├── file1
│   ├── file2
│   └── file3
└── dir2
    └── file1

2 directories, 4 files
% sort -z <(cd dir1; stat --printf '%n\0' *) <(cd dir2; stat --printf '%n\0' *) | uniq -zd | tr '\0' '\n'
file1
Другие вопросы по тегам