Посмотрите внимательно на свой журнал ошибок, 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, который использует тот же разделитель. Таким образом, мы гарантированно никогда не захлебнемся из-за неожиданного символа в любом имени файла.