Как сделать только дубликаты для разностной печати?
Я пытаюсь выяснить, какие файлы присутствуют в двух сравниваемых папках. Меня интересует только сравнение имен файлов.
Добавление -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