在 shellscript 中处理带有空白的文件名

在 shellscript 中处理带有空白的文件名

这些是我的文件夹结构。

[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删除最长的匹配字符串。效果是它会返回最后一个 之后的内容。*//

相关内容