У меня есть файл, и я хочу сравнить его со всеми файлами в другом каталоге, чтобы определить, какой из них совпадает - PullRequest
0 голосов
/ 17 мая 2018

У меня есть файл foo и панель папок. Панель папок - это многоуровневый каталог, в котором в конечном итоге находятся файлы: bar/1/123/file bar/2/12/file bar/1/1/file

foo совпадает с одним из файлов, и я пытаюсь найти, какой это. Как я могу сделать это на Linux? Я думаю, что это будет с командой поиска.

Ответы [ 3 ]

0 голосов
/ 17 мая 2018

Небольшая однострочная строка, которая может помочь:

for FILE in $(find . -type f -name file); do diff $FILE foo &>/dev/null && echo $FILE;done

Это позволит сравнить каждый файл, найденный во всех подкаталогах текущего местоположения с именем «file», с файлом с именем foo,Если различий не найдено, имя файла будет выведено на экран.Обратите внимание, что вы не будете получать спам с результатами каждого сравнения.

0 голосов
/ 17 мая 2018

Один из способов сделать это (избегая проблем совместимости с различными версиями bash) - это find выполнить рекурсию за вас и непосредственно запустить cmp:

find bar -type f -exec cmp -s -- foo '{}' ';' -print
0 голосов
/ 17 мая 2018

Если ваш bash не является палеолитическим, вы можете легко сделать это с помощью чистого bash:

shopt -s globstar
for f in bar/**/*; do
  if [[ -f "$f" ]] && cmp -s foo "$f"; then
    printf "The matched file is '%s'\n" "$f"
    break
  fi
done

Параметр globstar, который позволяет использовать bar/**/* для обозначения «всех файлов в дереве каталогов, озаглавленном bar», был представлен в bash 4.0, выпущенном в 2009 году. (К сожалению, эта версия не установлена по умолчанию в OS X.)

break в цикле - это оптимизация, которая останавливает поиск после того, как найден один файл, поскольку в описании проблемы четко указано «один из файлов». Если возможно несколько совпадений, и вам необходимо знать все из них, удалите break.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...