Обрабатывать имя файла с пустым в оболочке

243
whitebear

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

[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 "$" ln -ds "/data/$" "/links/$" done 

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

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

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

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

1
Просто поместите кавычки вокруг имени файла. ** `ln -ds" / data / "$ " "" / link / "$ " "` **. C0deDaedalus 5 лет назад 0

1 ответ на вопрос

1
Kamil Maciorowski

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

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

"/data/$" "/links/$" 

добавляет /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="$" # the rest of your script 

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

Я использую `cd` во главе скрипта, и это работает !! спасибо за ваше точное описание. Я должен быть более осторожным. whitebear 5 лет назад 0

Похожие вопросы