Как cmp несколько файлов с относительными путями, используя bash - PullRequest
0 голосов
/ 29 июня 2018

У меня есть каталог с именем filesystem, который выглядит примерно так:

- filesystem
  - etc
    - systemd
      - system
        - custom.service
        - custom2.service
  - hostname

Эти файлы копируются в корневой каталог, после чего их необходимо проверить. Например: filesystem/etc/hostname копируется в /etc/hostname.

Я пытался написать скрипт bash для сравнения каждого файла в файловой системе.

for file in $(find filesystem -type f)
do
  cmp file ${file#filesystem}
done

Цель ${file#filesystem} - удалить «файловую систему» ​​из пути ко второму файлу.

Это не работает - возвращается «Нет такого файла или каталога». Как исправить этот код?

1 Ответ

0 голосов
/ 29 июня 2018

Как отмечается в комментариях, конкретная проблема с вашим кодом заключается в том, что вам не хватает $ для расширения file. Тем не менее, обработка вывода ls или find может столкнуться с проблемами, когда имена файлов содержат любой символ IFS. Пробелы являются распространенным примером, но переводы строк приводят к путанице во многих попытках обработать пробелы.

Один из вариантов решения этой проблемы - использовать -exec с find и вызывать оболочку, поскольку вам нужны некоторые возможности оболочки для расширения параметров.

Здесь мы будем использовать sh -c со строкой для запуска, которая является командой cmp, и мы передадим, что sh 2 аргумента, первый - это заполнитель, это имя оболочки, а второй - имя файла. параметр:

find filesystem -type f -exec sh -c 'cmp "$1" "${1#filesystem}"' _ {} \;

Мы заключаем в кавычки переменные внутри sh -c, и find гарантирует, что {} будет правильно передан как один аргумент.

...