在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以/结尾,则目录的内容被复制而不是目录本身”。 所以它似乎是达尔文cp
devise的一部分。
但是,可以在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似乎有伎俩。