在终端(使用 bash 和 tcsh)中,如果文件夹参数末尾有 /,则 cp -r 复制文件夹的内容而不是文件夹。
给定以下结构:
folderA
|-fileA
|-fileB
以下命令将 fileA 和 fileB 复制到目标,而不是将文件夹 A 复制到目标:
cp -r folderA/ destination
所以它充当
cp -r folderA/* destination
这非常烦人,因为默认情况下,tcsh 中的完成会在文件夹末尾添加一个 /,所以如果我忘记删除末尾的 /,我总是不得不清理。这种行为与我工作过的所有其他 *nix 都不同。
有什么办法可以改变它并使 cp -r folderA/ 复制文件夹而不是其内容?
有一个案例表明这种行为更有意义(我相信它被 rsync 使用,即使在 GNU/Linux 上也是如此)。考虑以下情况:
这三个说明符的语义都是不同的:
我相信这是 BSD 和 GNU 之间差异的一个例子。您可以使用fink安装 GNU 风格的工具(请参阅coreutils 包),但这些工具可能不会保留所有 HFS+ 元数据,因此请谨慎操作。
您可以拦截命令并去掉尾部斜杠。我将把它作为练习留给读者或其他回答者。
您可以更改制表符完成行为,以便一开始就不会添加斜杠。将以下内容添加到您的
~/.tcshrc
:您可以通过将以下内容添加到您的 bash 和 misc readline 实用程序中来实现类似的效果
~/.inputrc
:无需手动删除默认安装中附加的“/”?不幸的是,在 Apple 的 Darwin手册页上没有说明cp 是“如果 source_file 以 / 结尾,则复制目录的内容而不是目录本身。” 所以它似乎是达尔文设计的一部分
cp
。但是,可以取消设置
addsuffix
shell 变量,tcsh
以便将“/”从添加到目录中删除。最大的缺点是现在很难判断你是在处理目录还是文件,只是从完成开始。为此,请在命令行中输入(或添加到 .tcshrc):因为
bash
您可以使用该mark-directories
设置。您可以键入以下内容或将其添加到您的 .bashrc:使用标记目录的来源:MacNN 论坛:Hal Itosis
“你可以截取命令并去掉尾部的斜线。我会把它作为练习留给读者或其他回答者。” 添加
到 ~/.bashrc 似乎可以解决问题。