我目前正在寻找在 Linux 中抑制错误命令的方法,特别是命令cp.
我愿意:
root@ubuntu:~$ cp /srv/ftp/201*/wha*/*.jj ~/.
cp: cannot stat `/srv/ftp/201*/wha*/*.jj': No such file or directory
Run Code Online (Sandbox Code Playgroud)
如何抑制打印在屏幕上的错误消息?即,我不想在显示器中看到此错误消息。
我在我的一个构建脚本中收到了这个奇怪的错误消息 -cp失败,返回错误“文件存在”。我什至尝试使用cp -f,如果文件存在,它应该覆盖文件,但错误仍然出现。cp当我手动执行时,运行以覆盖现有文件效果很好。什么可能导致此错误?
为什么有些 GNU Coreutils 命令有-T/--no-target-directory选项?似乎它所做的一切都可以使用.传统 Unix 目录层次结构中的(自点)语义来实现。
考虑:
cp -rT /this/source dir
Run Code Online (Sandbox Code Playgroud)
该-T选项可防止副本创建dir/source子目录。而是/this/source被标识dir并相应地在树之间映射内容。因此,例如/this/source/foo.c转到dir/foo.c等等,而不是到dir/source/foo.c。
但这可以很容易地完成,而无需-T使用以下选项:
cp -r /this/source/. dir # Probably worked fine since dawn of Unix?
Run Code Online (Sandbox Code Playgroud)
从语义上讲,尾随点组件被复制为 的子级dir,但当然该“子级”已经存在(因此不必创建)并且实际上是dir它本身,因此效果是用/this/path标识的dir。
如果当前目录是目标,它工作正常:
cp -r /this/tree/node/. . # node's children go to current dir
Run Code Online (Sandbox Code Playgroud)
有什么东西你只能用-T它来合理化它的存在吗?(除了对未实现点目录的操作系统的支持,文档中未提及的基本原理。)
上面的点技巧是否不能解决 GNU 信息文档中提到的相同竞争条件-T?
如果我想留在同一个文件系统上,我不能为同一个文件系统指定一个输出路径吗?
还是为了防止意外离开当前文件系统?
我正在尝试将一个大目录从一个驱动器复制到另一个驱动器。我在完成之前错误地注销了,所以只有大约 80% 的文件复制了过来。是否可以在不从头开始的情况下复制剩余的文件?
将文件 fileA.big (900mb) 从位置 B 复制到位置 C 有什么影响,如果在该 cp 操作期间,例如通过该过程的 35%,fileA.big 附加了新信息并从 900MB 增长到 930MB?
最终副本的结果是什么(即位置 C 的 fileA.big)?
如果副本通过了大约70%,并且原始文件被更新但这次被截断为400MB(即副本的进度超出了截断点),那么最终副本的结果是什么?
指 ext3/ext4 文件系统上的 Linux 操作系统。没有卷影魔法等。只是普通的老cp。通过复制实时 CouchDB 文件进行备份激发了好奇心,但对一般场景而不是特定用例更感兴趣。
这个答案表明可以将所有文件(包括隐藏文件)从目录复制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) cp 是一个非常流行的 Linux 工具,由 GNU 基金会的 coreutils 团队维护。
默认情况下,具有相同名称的文件将被覆盖,如果用户想要更改此行为,他们可以添加--no-clobber到他们的复制命令中:
Run Code Online (Sandbox Code Playgroud)-n, --no-clobber do not overwrite an existing file (overrides a previous -i option)
为什么不是这样的--no-overwrite?
我非常了解硬链接的概念,并且已经多次阅读基本工具的手册页,例如cp--- 甚至最近的 POSIX 规范。我仍然惊讶地观察到以下行为:
$ echo john > john
$ cp -l john paul
$ echo george > george
Run Code Online (Sandbox Code Playgroud)
此时john和paul将具有相同的 inode(和内容),并且george在这两个方面都会有所不同。现在我们这样做:
$ cp george paul
Run Code Online (Sandbox Code Playgroud)
在这一点上,我期望george和paul拥有不同的 inode 编号但内容相同——这个期望得到了满足——但我也期望paul现在有一个不同的 inode 编号john,并且john仍然有内容john。这是我感到惊讶的地方。事实证明,将文件复制到目标路径paul也会导致在共享paul的 inode 的所有其他目标路径上安装相同的文件(相同的 inode)。我想cp创建一个新文件并将其移动到以前由旧文件占据的位置paul。相反,它似乎是打开现有文件paul,截断它,然后写入george的内容到现有文件中。因此,具有相同 inode 的任何“其他”文件都会同时更新“他们的”内容。
好的,这是一种系统行为,现在我知道期待它,我可以弄清楚如何解决它,或者在适当的时候利用它。让我感到困惑的是,我应该在哪里看到这种行为的记录?如果它没有记录我会感到惊讶的地方在文件我已经看过。但显然我错过了它,现在找不到讨论这种行为的来源。
我有一个新安装的 Ubuntu 服务器,它应该是我们 VM 存储的新备份服务器。该服务器有 4 个网卡,其中 2 个是 10Gbit(实际上是具有最新驱动程序的 intel x540-T2),用于连接到 SAN。我在本地安装了 nfs-share 并比较了速度差异,同时复制了一个包含 ~30 个文件、大约 15 个 vm-images 和相应日志文件的目录。图像大小介于 8 GB 和 600 GB 之间。
使用:
cp -rf /mnt/nfs-share /backup-storage/
Run Code Online (Sandbox Code Playgroud)
bmon 因此显示大约 600 MiB/s。
使用
rsync -av /mnt/nfs-share /backup-storage/
Run Code Online (Sandbox Code Playgroud)
bmon 在前几秒显示一些数据包,暂停大约 30 秒,然后增加到大约 60-75 MiB/s。CPU在60%左右。
我应该/可以更改什么以使用rsync与 相同的性能cp?
cp ×10
coreutils ×2
hard-link ×2
command-line ×1
concurrency ×1
data ×1
dot-files ×1
file-copy ×1
files ×1
filesystems ×1
gnu ×1
history ×1
performance ×1
recursive ×1
rsync ×1
shell ×1
ubuntu ×1
wildcards ×1