从我读过的文件夹中复制内容,用途是:
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)
那么,星号是适用于任何地方的更好选择吗?
ees*_*ada 10
这两种论证形式之间存在根本区别。了解正在发生的事情很重要。
随着../foldersource/.参数传递不变的命令,无论是cp或rm或别的东西。该尾随点是否具有不同于简单指向它所在目录的标准 Unix 约定的特殊或独特语义取决于命令;双方rm并cp似乎把它当作一个特例。
在命令执行并传递任何参数之前../foldersource/*,shell 首先扩展参数。因此,永远不会看到;它可以看到扩展版本等等。这很重要,因为操作系统限制了可以传递给命令的参数数量,通常只有几百个。rm../foldersource/*../foldersource/file1.ext ../foldersource/file2.ext ../foldersource/childfolder1
roa*_*ima 10
当您复制使用cp -a source/* target/你最复制的文件和目录,从source到target。具体来说,被排除的项目可能是.在source.
考虑这些文件(或目录)在 source
apple # will be copied
banana/ # will be copied, as will all its contents
.cherry # will not be copied
Run Code Online (Sandbox Code Playgroud)
当您使用cp -a source/. target/复制时,您将复制 的全部内容source,包括以点 ( .)开头的任何项目到target
考虑这些文件(或目录)在 source
apple # will be copied
banana/ # will be copied, as will all its contents
.cherry # will be copied
Run Code Online (Sandbox Code Playgroud)
如果您使用bash, zsh,则可以使用该dotglob选项来更改 的含义,*以便它包含以点开头的文件和目录(yash也有一个dotglob选项;但是,它随后包含.和..限制了其可用性的全局扩展。另见FIGNORE='@(.|..)'在ksh93)。
有趣的cp -a source/. target/是,保证永远不会创建组件target/source。(另一方面,cp -a source target/将根据是否target已存在执行两件事之一。有关详细信息,请参阅如何使用 cp以幂等方式递归复制文件夹。)
当您使用rm -rf source/*删除时,您将删除其中source不以点 ( .)开头的文件和目录。以dotglob我已经提到的设置为准。它不会删除目录source本身。
当您尝试使用rm -rf source/.它删除时会失败 - 正如其他人已经解释的那样- 因为 POSIX 禁止删除其最后一个组件是.或的路径..。最接近的等效项是rm -rf source,它将删除source目录及其所有内容,无论它们是否以点 ( .)开头。
您不能这样做,rm -rf ../foldersource/.因为rm不允许这样做,如手册中明确所述:
任何删除最后一个文件名组成部分为“.”的文件的尝试。或 '..' 在没有任何提示的情况下被拒绝,如 POSIX 所规定的。
在 POSIX 手册中,man 1p rm我们看到:
如果文件 dot 或 dot-dot 中的任何一个被指定为操作数的基本名称部分(即最终的路径名组件),或者如果操作数解析为根目录,则 rm 应将诊断消息写入标准错误并且不执行任何操作更多这样的操作数。
| 归档时间: |
|
| 查看次数: |
10847 次 |
| 最近记录: |