Найдите идентичный файл с другим именем [duplicate]

Возможно, вам нужно обновить свое ядро. Я считаю, что ядра Ubuntu ниже 4.5 не находят мой тачпад Elantech по умолчанию.

Вы можете перейти на более новую версию, например 4.5, используя инструкции, найденные здесь:

Как обновить ядро до последней версии mainline без какого-либо Distro-обновления?

7
задан 28 February 2018 в 14:40

10 ответов

Когда единственное отличие состоит в том, что файлы с именами должны иметь одинаковый контент и размер.

1. О содержании. Мы можем сравнить два файла командой diff file-1 file-2. Также мы можем использовать эту команду для теста следующим образом:

diff -q file-1 file-2 > /dev/null && echo 'equal' || echo 'different'

1. О содержимом. Мы можем найти файл с определенным размером по команде (где 12672 - размер файла в байтах):

find /path/to/search -type f -size 12672c -printf '%p\n'

Или мы можем использовать диапазон таким образом ( где 12600-12700 - это размер файла в байтах):

find /path/to/search -type f -size -12700c -size +12600c -printf '%p\n'

Обратите внимание, что по умолчанию команда find работает рекурсивно.

3. Объедините два метода (где file-1 - наш файл шаблонов):

find /path/to/search -type f -size -12700c -size +12600c -printf '%p\t' -exec sh -c 'diff -q file-1 "$1" > /dev/null && echo "equal" || echo "different"' sh {} \;

3. Объедините два метода Предположим, что мы имеем следующую структуру каталогов:

$ tree /tmp/test /tmp/test ├── file-1 # this is the pattern file ├── file-2 # this is almost the same file but wit few additional characters └── file-3 # this is exact copy of file-1

Результат указанной команды будет:

$ find /tmp/test -type f -size -12700c -size +12600c -printf '%p\t' -exec sh -c 'diff -q file-1 "$1" > /dev/null && echo "equal" || echo "different"' sh {} \; /tmp/test/file-2 different # OK: here we have added few additional characters /tmp/test/file-3 equal # OK: this is exact copy of file-1 /tmp/test/file-1 equal # OK: this is file-1 compared to its self

Или мы можем упростить выход, изменив нашу команду таким образом:

$ find /tmp/test -type f -not -name "file-1" -size -12700c -size +12600c \ -exec sh -c 'diff -q file-1 "$1" > /dev/null && printf "%s\tis equal\n" "$1"' sh {} \; /tmp/test/file-3 is equal

Обновить из комментариев. Следующее командование для файла с тем же размером, что и file-1, а затем diff запятыми связано с параметрами --brief и --report-identical-files:

find /path -type f -not -name "file-1" -size $(stat -c%s file-1)c -exec diff -qs file-1 {} \; Files file-1 and /tmp/test/file-3 are identical

Мы можем сравнить md5sum файлы следующим образом:

Получить md5sum файла шаблона: $ md5sum file-1 d18b61a77779d69e095be5942f6be7a7 file-1 Использовать его с помощью нашей команды: $ find /path -type f -not -name "file-1" -size $(stat -c%s file-1)c -exec sh -c 'echo "d18b61a77779d69e095be5942f6be7a7 $1" | md5sum -c -' sh {} \; /tmp/test/file-3: OK
5
ответ дан 17 July 2018 в 19:49

Если вы ищете (или согласитесь) приложение GUI, вы можете попробовать приложение «FSlint Janitor». Вы можете установить его, запустив

sudo apt-get install fslint

Как использовать приложение:

После установки выполните следующие действия.

Запустите приложение. Выберите опцию «Дублировать» (1) для поиска файлов с одним и тем же контентом. Нажмите кнопку «+ Добавить» (2) и выберите каталоги для поиска файлов (убедитесь, что опция «recurse» отмечена для включения подкаталогов). Нажмите кнопку «Найти» (3) и подождите.

3
ответ дан 17 July 2018 в 19:49
Вы можете найти определенную строку с помощью grep -rl "string" (-r для рекурсивного поиска строки в файлах, -l для отображения имени файла, а не строки)
3
ответ дан 17 July 2018 в 19:49

Grep может быстро найти его

При правильном использовании команда grep может быстро найти дубликат. Вы должны быть осторожны, чтобы не искать всю файловую систему, иначе для завершения потребуется несколько дней. Я недавно документировал это здесь: `grep`ing всех файлов для строки занимает много времени

Для оптимальной скорости использования:

grep -rnw --exclude-dir={boot,dev,lib,media,mnt,proc,root,run,sys,/tmp,tmpfs,var} '/' -e 'String in file'

Если ваш файл может быть в каталоге Windows удалите каталог mnt.

Если вы знаете, что файл находится в каталоге /home, где-то вы можете сократить команду:

grep -rnw '/home' -e 'String in file'
2
ответ дан 17 July 2018 в 19:49

Это может занять некоторое время, но оно должно быть эффективным и надежным. Предполагается, что вы используете Bash. Замените file именем вашего переименованного файла:

shopt -s globstar for i in **; do [ -f "$i" ] && cmp --silent file "$i" && echo "$i"; done shopt -s globstar включает рекурсивное подтягивание с помощью **. Вы можете отключить его с помощью shopt -u globstar, но он отключен по умолчанию и отключится при открытии новой оболочки. for i in ** перебрать все файлы ниже этого. Запустите команду из каталога самого высокого уровня, который может содержать файл или каталог с файлом или каталогом ... (примените рекурсию к этому предложению!) [F7], если файл является обычным файлом, который существует тогда ... cmp --silent file "$i" &&, если нет разницы между file и проверяемым файлом (т. е. если cmp успешно завершается), тогда ... echo $i напечатает относительный путь файла (это также печатает путь к file но я не вижу большой пользы в том, чтобы это исправить).

Благодаря этому ответу на Stack Overflow для метода cmp сравнения файлов.

3
ответ дан 17 July 2018 в 19:49

Когда единственное отличие состоит в том, что файлы с именами должны иметь одинаковый контент и размер.

1. О содержании. Мы можем сравнить два файла командой diff file-1 file-2. Также мы можем использовать эту команду для теста следующим образом:

diff -q file-1 file-2 > /dev/null && echo 'equal' || echo 'different'

1. О содержимом. Мы можем найти файл с определенным размером по команде (где 12672 - размер файла в байтах):

find /path/to/search -type f -size 12672c -printf '%p\n'

Или мы можем использовать диапазон таким образом ( где 12600-12700 - это размер файла в байтах):

find /path/to/search -type f -size -12700c -size +12600c -printf '%p\n'

Обратите внимание, что по умолчанию команда find работает рекурсивно.

3. Объедините два метода (где file-1 - наш файл шаблонов):

find /path/to/search -type f -size -12700c -size +12600c -printf '%p\t' -exec sh -c 'diff -q file-1 "$1" > /dev/null && echo "equal" || echo "different"' sh {} \;

3. Объедините два метода Предположим, что мы имеем следующую структуру каталогов:

$ tree /tmp/test /tmp/test ├── file-1 # this is the pattern file ├── file-2 # this is almost the same file but wit few additional characters └── file-3 # this is exact copy of file-1

Результат указанной команды будет:

$ find /tmp/test -type f -size -12700c -size +12600c -printf '%p\t' -exec sh -c 'diff -q file-1 "$1" > /dev/null && echo "equal" || echo "different"' sh {} \; /tmp/test/file-2 different # OK: here we have added few additional characters /tmp/test/file-3 equal # OK: this is exact copy of file-1 /tmp/test/file-1 equal # OK: this is file-1 compared to its self

Или мы можем упростить выход, изменив нашу команду таким образом:

$ find /tmp/test -type f -not -name "file-1" -size -12700c -size +12600c \ -exec sh -c 'diff -q file-1 "$1" > /dev/null && printf "%s\tis equal\n" "$1"' sh {} \; /tmp/test/file-3 is equal

Обновить из комментариев. Следующее командование для файла с тем же размером, что и file-1, а затем diff запятыми связано с параметрами --brief и --report-identical-files:

find /path -type f -not -name "file-1" -size $(stat -c%s file-1)c -exec diff -qs file-1 {} \; Files file-1 and /tmp/test/file-3 are identical

Мы можем сравнить md5sum файлы следующим образом:

Получить md5sum файла шаблона: $ md5sum file-1 d18b61a77779d69e095be5942f6be7a7 file-1 Использовать его с помощью нашей команды: $ find /path -type f -not -name "file-1" -size $(stat -c%s file-1)c -exec sh -c 'echo "d18b61a77779d69e095be5942f6be7a7 $1" | md5sum -c -' sh {} \; /tmp/test/file-3: OK
5
ответ дан 23 July 2018 в 20:34
  • 1
    +1 для использования размера на первом месте. Кстати, командную строку diff можно упростить: diff -qs file-1 file-2 выполнит задание :-) – sudodus 28 February 2018 в 15:42
  • 2
    @sudodus -qs, вероятно, ускоряет diff, потому что он может прекратить сравнивать файлы при обнаружении первого несоответствия. – PerlDuck 28 February 2018 в 15:54
  • 3
    cmp -s лучше, чем diff, когда цель состоит в том, чтобы сказать, равны ли два файла. – John Kugelman 28 February 2018 в 17:54
  • 4
    Вам нужно узнать о xargs – Thorbjørn Ravn Andersen 28 February 2018 в 18:10
  • 5
    @JohnKugelman, я последовал твоему совету и начал использовать cmp -s для подобных случаев: askubuntu.com/a/1014921/566421 :-) – pa4080 14 March 2018 в 20:06

Если вы ищете (или согласитесь) приложение GUI, вы можете попробовать приложение «FSlint Janitor». Вы можете установить его, запустив

sudo apt-get install fslint

Как использовать приложение:

После установки выполните следующие действия.

Запустите приложение. Выберите опцию «Дублировать» (1) для поиска файлов с одним и тем же контентом. Нажмите кнопку «+ Добавить» (2) и выберите каталоги для поиска файлов (убедитесь, что опция «recurse» отмечена для включения подкаталогов). Нажмите кнопку «Найти» (3) и подождите.

3
ответ дан 23 July 2018 в 20:34
Вы можете найти определенную строку с помощью grep -rl "string" (-r для рекурсивного поиска строки в файлах, -l для отображения имени файла, а не строки)
3
ответ дан 23 July 2018 в 20:34
  • 1
    вы не должны использовать -i, как указано в ссылке @ mrfred489, поскольку файлы идентичны, и это может замедлить работу – Simon Van Machin 28 February 2018 в 14:36

Grep может быстро найти его

При правильном использовании команда grep может быстро найти дубликат. Вы должны быть осторожны, чтобы не искать всю файловую систему, иначе для завершения потребуется несколько дней. Я недавно документировал это здесь: `grep`ing всех файлов для строки занимает много времени

Для оптимальной скорости использования:

grep -rnw --exclude-dir={boot,dev,lib,media,mnt,proc,root,run,sys,/tmp,tmpfs,var} '/' -e 'String in file'

Если ваш файл может быть в каталоге Windows удалите каталог mnt.

Если вы знаете, что файл находится в каталоге /home, где-то вы можете сократить команду:

grep -rnw '/home' -e 'String in file'
2
ответ дан 23 July 2018 в 20:34

Это может занять некоторое время, но оно должно быть эффективным и надежным. Предполагается, что вы используете Bash. Замените file именем вашего переименованного файла:

shopt -s globstar for i in **; do [ -f "$i" ] && cmp --silent file "$i" && echo "$i"; done shopt -s globstar включает рекурсивное подтягивание с помощью **. Вы можете отключить его с помощью shopt -u globstar, но он отключен по умолчанию и отключится при открытии новой оболочки. for i in ** перебрать все файлы ниже этого. Запустите команду из каталога самого высокого уровня, который может содержать файл или каталог с файлом или каталогом ... (примените рекурсию к этому предложению!) [F7], если файл является обычным файлом, который существует тогда ... cmp --silent file "$i" &&, если нет разницы между file и проверяемым файлом (т. е. если cmp успешно завершается), тогда ... echo $i напечатает относительный путь файла (это также печатает путь к file но я не вижу большой пользы в том, чтобы это исправить).

Благодаря этому ответу на Stack Overflow для метода cmp сравнения файлов.

3
ответ дан 23 July 2018 в 20:34

Другие вопросы по тегам:

Похожие вопросы: