目录名称之间有什么区别吗,例如
mydirectory
和
mydirectory/
我注意到当我ls
在某些目录中执行时会发生这种情况 - 有些目录名称有斜杠,有些没有。这是有问题的,因为如果我想访问目录中包含的文件,我可能需要在末尾添加斜杠:
vi $mydirectory"/"$myfile
或者简单地做
vi $mydirectory$myfile
答案1
没有/
它也可能是一个文件。
在某些情况下,这可能是致命的。例如,当使用mv
:
mv file1 mydirectory
mv file2 mydirectory
mv file3 mydirectory
好的?但如果mydirectory
不存在或不是目录,则最终结果是 和file1
消失file2
,file3
现在命名为mydirectory
。
mv file1 mydirectory/
mv file2 mydirectory/
mv file3 mydirectory/
如果mydirectory
不存在,您得到的只是三个错误消息 和file1
,file2
并且file3
仍然存在。
因此/
消除了一些歧义。
除此之外,实际上没有任何规则。有些程序的行为可能会有所不同,具体取决于您是否/
在最后提供了 。该怎么做取决于他们。
在某些情况下,如果使用太多也会遇到问题/
。例如,在其输出中find
保留剩余/
,如果您尝试使用简单的字符串比较而不是诸如此类的东西来查找文件/路径名,这可能会让您出错realpath
。
答案2
这可能是一个“显示”的事情ls
,即,如果你这样做ls -p
或ls -F
,它应该在目录后面一致地添加斜杠。它本质上是添加关于它认为文件是什么的视觉提示。 (请注意-F
,它还将附加@
到符号链接、*
具有可执行权限的文件、|
命名管道、=
套接字等)。您还可以使用ls -d directory/
vs进行重现ls -d directory
。
/
我\0
相信这是文件/目录名称中唯一无效的两个字符。
始终添加斜杠应该是安全的,如果您正确分配了 mydirectory 和 myfile,则执行操作vim "$mydirectory/$myfile"
应该符合您的预期。 (警告$mydirectory
并$myfile
已正确分配)。foo/bar
并且foo//bar
应该是等价的。
一般来说;我真的不喜欢将 ls 的输出分配给变量并处理它,主要是因为我之前对文件名中的字符加上缺少引用而感到惊讶,最终导致了破坏性结果。 (即prefix=/home user=" oops" rm -rf $prefix$user
,这最终会递归删除/home
,然后尝试递归删除./oops
)。
我不使用 ls,而是尝试通过 bash 或find -print0 | xargs -0
.如果您确实使用ls
,请确保您没有使用 的现有别名ls
,并且使用适合您的特定任务的显示选项。
答案3
如果您在“花式文件名”的上下文中考虑目录或文件夹,则该文件夹仍然是一个文件,但文件夹更像是一个指向容器的指针,就像文件柜中的文件夹一样,因此如果您表示或使用斜杠“/ ” 或斜线点“/”。对于脚本来说,了解并确保您指的不是文件而不是文件夹是有帮助的。
希望这是有道理的。