Находить и переименовывать скрытые файлы в точечные (скрывать файлы) - PullRequest
0 голосов
/ 19 февраля 2020

Я пишу свои точечные файлы и хочу найти нескрываемые файлы в древовидной структуре после создания символической ссылки c в моем домашнем каталоге.

for f in `find ../dotfiles -mindepth 2 -type f`; do ln -sfn "${f}" ".${f}"; done

, но этот код не удался

введите описание изображения здесь

1 Ответ

1 голос
/ 19 февраля 2020

Посмотрите внимательно на свой журнал ошибок, find жалуется на пути типа .../dotfiles/rest/of/the/path, где три лидирующие точки являются результатом расширения .${f}. Поскольку вы сказали, что вам нужны копии в вашем домашнем каталоге, желаемое расширение будет ~/.path (или, может быть, ./.path также будет работать, если вы выполняете find из вашего домашнего каталога).

A Решением этой проблемы было бы использование basename для удаления ведущих каталогов из полного пути к файлу:

for f in `find ../dotfiles -mindepth 2 -type f`; do
    filename="$(basename "$f")"
    ln -sfn "${f}" "~/.$filename"
done

Однако способ, которым вы перебираете выходные данные find, склонен нарушать IFS: например, если один из сопоставленных файлов содержит пробел, он будет повторяться как два отдельных элемента. Мы могли бы также исправить это:

find ../dotfiles -mindepth 2 -type f -print0 | while IFS='' read -r -d $'\0' f; do
    filename="$(basename "$f")"
    ln -sfn "${f}" "~/.$filename"
done

В этом коде мы используем действие find *1017* для разделения его результатов с помощью ASCII NUL \0, который не может быть найден в именах файлов. Затем мы перебираем вывод find с while/read l oop, который использует тот же разделитель. Таким образом, мы гарантированно никогда не захлебнемся из-за неожиданного символа в любом имени файла.

...