1

Это моя структура папок.

[set symbolic links here]
/links/

[entity]    
/data/a 1/  #(folder name has blank)
/data/b 1/
/data/c 1/
/data/d 1/
.
.
.

Я хочу сделать символическую ссылку для каждой сущности сразу с помощью шеллскрипта.

for file in /data/*; do
    echo "${file}"
   ln -ds "/data/${file}" "/links/${file}"
done

Однако это показывает ошибку, как это.

/data/a 1
ln: failed to create symbolic link '/data//links/a 1': No such file or directory

Я думаю, что это актуально с пробелами в имени папки ....???

Как я могу решить это ??

1 ответ1

1

Вы уверены, что это /data//links/a 1 в сообщении об ошибке? Я ожидаю /links//data/a 1 ...

Бланки не проблема. Посмотрите, что дало вам ваше echo . Ваш $file уже содержит /data/ string. Кусок кода

"/data/${file}" "/links/${file}"

добавляет /data/ или /links/ в строку, где /data/ уже есть.

Самое простое решение - сделать $file вообще не содержащим /data/ :

cd /data
for file in *; do
# the rest of your script
# in general remember you're in a different dir now

В качестве альтернативы вы можете сохранить for file in /data/*; и удалите лишнюю часть позже:

for file in /data/*; do
file=$(basename "$file")
# the rest of your script

Приведенное выше решение порождает несколько процессов, потому что basename - это отдельный исполняемый файл. По этой причине вы можете захотеть, чтобы работа выполнялась самой оболочкой:

for file in /data/*; do
file="${file##*/}"
# the rest of your script

Синтаксис ${file##*/} печатает $file но удаляет самую длинную строку, совпадающую */ с передней части. Эффект дает вам все, что есть после последнего / .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .