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

На этот вопрос уже есть ответ здесь:

Возможно ли найти, не зная его имени?

Я создал файл с помощью LaTex, затем скопировал его в другой локальный каталог и переименовал в pdf. Я больше не знаю, где находится исходный файл, но у меня есть переименованный файл. Я хотел бы внести некоторые изменения в свой латексный файл и воссоздать PDF-файл.

Поскольку я знаю, что исходный файл точно такой же, как и переименованный, за исключением имени, могу ли я найти свой исходный файл каким-либо образом?

8
задан 28 February 2018 в 03:40

5 ответов

То, когда единственной разницей являются файлы стенда имени, должно иметь то же содержание и размер.

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

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

2. О размере. Мы можем найти файл с определенным размером командой (где 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 {} \;

4. Пример. Давайте предположим, что у нас есть следующая структура каталогов:

$ 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 November 2019 в 05:27
  • Можно искать конкретную строку с grep -rl "string" (-r для рекурсивного, находя строку в файлах,-l для показа имени файла, не строки)
3
ответ дан 23 November 2019 в 05:27

При поиске (или хорошо с) приложения GUI можно попробовать "приложение" Швейцара FSlint. Можно установить его путем выполнения

sudo apt-get install fslint

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

После того, как установленный, выполните шаги ниже.

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

enter image description here

3
ответ дан 23 November 2019 в 05:27

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

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

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

3
ответ дан 23 November 2019 в 05:27

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 November 2019 в 05:27

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

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