На этот вопрос уже есть ответ здесь:
Возможно ли найти, не зная его имени?
Я создал файл с помощью LaTex, затем скопировал его в другой локальный каталог и переименовал в pdf. Я больше не знаю, где находится исходный файл, но у меня есть переименованный файл. Я хотел бы внести некоторые изменения в свой латексный файл и воссоздать PDF-файл.
Поскольку я знаю, что исходный файл точно такой же, как и переименованный, за исключением имени, могу ли я найти свой исходный файл каким-либо образом?
То, когда единственной разницей являются файлы стенда имени, должно иметь то же содержание и размер.
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
grep -rl "string"
(-r для рекурсивного, находя строку в файлах,-l для показа имени файла, не строки)При поиске (или хорошо с) приложения GUI можно попробовать "приложение" Швейцара FSlint. Можно установить его путем выполнения
sudo apt-get install fslint
После того, как установленный, выполните шаги ниже.
Это могло бы требовать времени, но это должно быть эффективно и надежно. Это предполагает использование 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
метод сравнения файлов.
При надлежащем использовании, 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'