recursioncp复制文件夹内容而不是OS X上的文件夹

在terminal中(使用bash和tcsh)如果文件夹参数在最后有一个/,cp -r复制文件夹的内容而不是文件夹的内容。

鉴于以下结构:

folderA |-fileA |-fileB 

以下命令将fileA和fileB复制到目标,而不是将folderA复制到目标:

 cp -r folderA/ destination 

所以它的行为

 cp -r folderA/* destination 

这是非常烦人的,因为默认情况下,在tcsh中完成在文件夹的末尾添加一个/,所以如果我忘记删除/最后总是最终不得不清理。 这种行为是不同于我工作的其他* nix。

有没有什么办法来改变这个,并使cp -r folderA /复制文件夹,而不是其内容?

有一种情况要做,这种行为更有意义(我相信它的使用rsync,甚至在GNU / Linux上)。 考虑以下情况:

  mydir |-.fileA |-fileB 

这三个说明符的语义都是不同的:

  cp -r mydir dest/ # creates dest/mydir, containing both files cp -r mydir/ dest/ # copies both files directly into dest cp -r mydir/* dest/ # copies fileB, but not .fileA, directly into dest 

我相信这是BSD和GNU之间区别的一个例子。 您可以使用fink安装GNU风格工具(请参阅coreutils包 ),但这些工具可能不会保留所有HFS +元数据,因此请谨慎操作。

您可以拦截该命令并去除尾部的斜线。 我会把这个作为练习留给读者或其他答复者。

您可以更改制表符的完成行为,所以斜杠不是首先添加的。 将以下内容添加到~/.tcshrc

  unset addsuffix 

你可以通过在~/.inputrc添加以下内容来达到类似bash和misc readline工具的效果:

  set mark-directories off 

没有手动删除默认安装中附加的“/”? 不幸的是,在苹果公司的达尔文手册页上对cp所说的是“如果source_file以/结尾,则目录的内容被复制而不是目录本身”。 所以它似乎是达尔文cpdevise的一部分。

但是,可以在tcsh中取消设置addsuffix shellvariables,以便将“/”添加到目录中。 最大的缺点就是现在很难判断你是否正在处理一个目录或文件。 在命令行上input(或添加到.tcshrc中):

  unset addsuffix 

对于bash您可以使用mark-directories设置。 您可以键入以下内容或将其添加到您的.bashrc中:

  bind 'set mark-directories off' 

使用标记目录的源代码: MacNN论坛:Hal Itosis

“你可以截取命令并去掉尾随的斜线,我将把这个作为练习留给读者或其他答复者。 添加

 function cp() { /bin/cp $(echo "$*" | sed 's|/ | |g'); } 

〜/ .bashrc似乎有伎俩。