这个答案表明可以将所有文件(包括隐藏文件)从目录复制src到目录中,dest如下所示:
mkdir dest
cp -r src/. dest
Run Code Online (Sandbox Code Playgroud)
答案或其评论中没有解释为什么这实际上有效,似乎也没有人找到有关此的文档。
我尝试了一些东西。一、正常情况:
$ mkdir src src/src_dir dest && touch src/src_file src/.dotfile dest/dest_file
$ cp -r src dest
$ ls -A dest
dest_file src
Run Code Online (Sandbox Code Playgroud)
然后,/.最后:
$ mkdir src src/src_dir dest && touch src/src_file src/.dotfile dest/dest_file
$ cp -r src/. dest
$ ls -A dest
dest_file .dotfile src_dir src_file
Run Code Online (Sandbox Code Playgroud)
因此,这与 的行为类似*,但也会复制隐藏文件。
$ mkdir src src/src_dir dest && touch src/src_file src/.dotfile dest/dest_file
$ cp -r src/* dest …Run Code Online (Sandbox Code Playgroud) 由于我犯的一个愚蠢的错误,我刚刚丢失了我的音频收藏的一小部分。:-( 很
高兴我有一个相当新的备份,但它仍然很烦人。除了你的真实之外,另一个做恶作剧的罪魁祸首是mv,它将显示如下:
音频文件有一定的方案:
ARTIST - Some Title YY.mp3
Run Code Online (Sandbox Code Playgroud)
其中YY是 2 位数年份规范。
mkdir 90<invisible control character>
Run Code Online (Sandbox Code Playgroud)
(直到此刻,我都不知道我实际上输入了三分之一看不见的多余字符......!)
我希望将所有 1990 年代的音乐都放在一个目录中,而不是将所有内容都放在一个目录中。所以我输入:
find . -name '* 9?.mp3' -exec mv {} 90 \;
Run Code Online (Sandbox Code Playgroud)
不难明白发生了什么,嗯?:->
(灾难性的)结果是一个名为“90 something ”的原始空目录(某些东西是“隐形”控制字符)和一个名为“90”的单个文件,被覆盖了n次。
所有文件都不见了。:-(( (明显地)
Wishmv会及时检查目标“文件”的签名(请记住 *NIX: Everything Is A File)是否以d------(例如drwxr-xr-x)开头。而且,当然,目的地是否存在。有上述情况下,当你只是一个变种忘到mkdir的目录第一。(当然,你假设它在那里......)
甚至我们以大写字母W开头的讨厌的操作系统也会这样做。如果您要求,甚至会提示您指定目标类型(文件?目录?)。
因此,我想知道我们 *NIXers …
问题:我需要一个简单的示例来说明如何使用cp --no-target-directory.
我确实在理解上遇到了一些困难cp --no-target-directory。我确实理解的解释mv --no-target-directory,但我真的无法想象将它用于 的方法cp。
例如,当命令
mv /tmp/source /tmp/dest成功时,不能保证/tmp/source已重命名为/tmp/dest:/tmp/dest/source如果其他进程创建/tmp/dest为目录,则可以将其重命名为。但是,如果mv -T /tmp/source /tmp/dest成功,毫无疑问/tmp/source was renamed to/tmp/dest`。(来源)
从我读过的文件夹中复制内容,用途是:
cp -rfva ../foldersource/. ./
Run Code Online (Sandbox Code Playgroud)
但这也有效
cp -rfva ../foldersource/* ./
Run Code Online (Sandbox Code Playgroud)
有什么区别吗?
例如,如果我想从文件夹中删除内容。:
rm -rf ../foldersource/.
Run Code Online (Sandbox Code Playgroud)
我收到错误:
rm: rejet delete folder '.' or '..':
Run Code Online (Sandbox Code Playgroud)
但带星号就可以了
rm -rf ../foldersource/*
Run Code Online (Sandbox Code Playgroud)
那么,星号是适用于任何地方的更好选择吗?
假设我们在一个空白目录中。然后,执行以下命令:
mkdir dir1
cp -r dir1 dir2
Run Code Online (Sandbox Code Playgroud)
生成两个(空白)目录dir1和dir2,其中dir2已创建为dir1. 但是,如果我们这样做:
mkdir dir1
mkdir dir2
cp -r dir1 dir2
Run Code Online (Sandbox Code Playgroud)
然后我们反而发现dir1现在已经放到里面了dir2。这意味着完全相同的cp命令的行为取决于目标目录是否存在。如果是,则该cp命令的作用与此相同:
mkdir dir1
mkdir dir2
cp -r dir1 dir2/.
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎非常违反直觉。我原以为cp -r dir1 dir2(当dir2已经存在时)会删除现有dir2(和任何内容)并将其替换为dir1,因为这是cp用于两个文件时的行为。我知道递归副本本身有点不同,因为目录在 Linux 中(更广泛地在类 Unix 系统中)存在,但我正在寻找更多关于为什么选择这种行为的解释。如果您能指出一种方法来确保cp行为符合我的预期(而不必事先测试并删除目标目录),则可以加分。我尝试了一些cp选择,但没有任何运气。我想我会接受rsync 为了其他不知道该命令的人在这个问题上发生的解决方案。
如果这种行为不普遍,我在 CentOS 上使用 bash。
我的理解cp src dest是:
src是一个文件并且dest不存在,但它的父目录存在,dest则创建。src是一个文件并且dest是一个文件,dest则被src.src是文件并且dest是目录,dest/src则创建。我试图避免情况#3。如果我编写一个脚本,假设它dest 不是一个目录,但在运行时结果是这样,我不想cp将文件放在错误的位置并继续静默。
相反,我希望它:
dest目录并将其替换为所需的文件。我也更喜欢这种情况以原子方式发生。使用单独的命令test -d来检查是否dest是目录会为 TOCTTOU 问题提供机会。
这可以做到cp吗?如果没有,是否可以使用任何其他类似的无处不在的命令来完成?
我对便携式解决方案和依赖非标准扩展的解决方案都感兴趣,只要它们相当普遍。
我希望将仅包含这些文件的目录内的所有文件(所有文件都是常规文件 - 该目录内没有目录、符号链接等)复制到另一个预先存在的目录。
这些文件具有非常常见的名称,例如robots.txt,并且不遵循任何特定模式。
我尝试了类似的命令:
cp -a "$HOME"/a "$HOME"/b
Run Code Online (Sandbox Code Playgroud)
我知道这-a是一个快捷组合-d(保留模式、所有权和时间戳)以及-R命令递归复制。
如果复制是递归的,为什么不复制文件以及解决方案是什么?