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

7

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

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

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

    
задан dmx 28.02.2018 в 10:20
источник

5 ответов

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 "" > /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 "" > /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 "" > /dev/null && printf "%s\tis equal\n" ""' 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 " | md5sum -c -' sh {} \;
    /tmp/test/file-3: OK
    
ответ дан pa4080 28.02.2018 в 11:20
источник
3
  • Вы можете найти определенную строку с grep -rl "string" (-r для рекурсивного поиска строки в файлах, -l для отображения имени файла, а не строки)
ответ дан Simon Van Machin 28.02.2018 в 10:35
источник
3

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

sudo apt-get install fslint

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

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

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

    
ответ дан pomsky 28.02.2018 в 11:18
источник
2

Это может занять некоторое время, но оно должно быть эффективным и надежным. Предполагается, что вы используете 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 ** перебрать все файлы ниже этого. Запустите команду из каталога самого высокого уровня, который может содержать файл или каталог с файлом или каталогом ... (примените рекурсию к этому предложению!)
  • [ -f "$i" ] && , если файл является обычным файлом, который существует тогда ...
  • cmp --silent file "$i" && , если нет разницы между file и проверяемым файлом (т. е. если cmp успешно завершается), тогда ...
  • echo $i печатает относительный путь файла (это также печатает путь file , но я не вижу большой пользы в его исправлении).

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

    
ответ дан Zanna 28.02.2018 в 10:58
источник
1

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'
    
ответ дан WinEunuuchs2Unix 28.02.2018 в 11:18
источник

Ознакомьтесь с другими вопросами по меткам