我运行了一个Reddit用户为我编写的命令:
dest=final_dir
files=$(find dir1 dir2 dir3 -type f)
for file_path in $files; do
IFS='/' read -r -a tokens <<< "$file_path"
dest_fname="${tokens[1]}.${tokens[0]}"
ln -s "$PWD/$file_path" "$PWD/$dest/$dest_fname"
done
它应该获取所有子文件夹中的所有文件,并创建一个符号链接到另一个目录,链接名称为filename+filefolder。然而,它只会给我一个错误:无法创建符号链接-没有这样的文件或目录。这里是控制台的截图:https://imgur.com/36F4sdX 有什么想法可能是问题吗?
编辑: 好的,问题似乎是当路径包含空格时,它认为名称停在这个空格处,因此找不到文件。有什么方法可以解决这个问题吗?
这里是脚本应该执行的描述。 我的当前文件系统看起来像这样:
dir1:file1,file2
dir2:file1,file2
如果我现在运行上面的命令,我会得到:
dir3:file1,file2
其他两个文件被跳过,因为它们具有相同的名称。
还有这种情况:
dir1:file1,file3
dir2:file2,file4
在这种情况下,文件将混合为:
目录3: 文件1, 文件2, 文件3, 文件4
然而我想要的是:
目录3: 文件1, 文件3, 文件2, 文件4
在我看来,实现这一点最简单的方法是将源文件夹作为符号链接名称的一部分,像这样:
目录3: dir1-file1, dir1-file3, dir2-file3, dir2-file4
我希望这足够清楚地解释了。
目前问题似乎是当文件或文件夹名称包含任何特殊字符,比如“-”或“_”,它会停止读取该名称。
这导致:
dir1-2: file3-4创建到dir1.file3不存在的符号链接。
set -x
。这样,Shell 将在扩展但尚未执行命令时回显每个命令,使您能够查看导致问题的命令的详细信息。 - John Bollingerfiles
变量是否有错误内容,其中文件名中的空格与文件名之间的空格无法区分?请阅读[mcve]的含义并提供它。 - Tsyvarev