这些是我的文件夹结构。
[set symbolic links here]
/links/
[entity]
/data/a 1/ #(folder name has blank)
/data/b 1/
/data/c 1/
/data/d 1/
.
.
.
我想通过 shellscript 一次为每个实体创建符号链接。
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
你确定这是/data//links/a 1
错误消息吗?我期望/links//data/a 1
……
空格不是问题。看看你echo
给了你什么。你的$file
已经包含/data/
字符串。这段代码
"/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
是单独的可执行文件。因此,您可能希望由 shell 本身完成该工作:
for file in /data/*; do
file="${file##*/}"
# the rest of your script
该语法${file##*/}
会打印但会从其前面$file
删除最长的匹配字符串。效果是它会返回最后一个 之后的内容。*/
/