Answers:
原因是,在中bash
,*
不包括以点(.
)开头的文件。
你可以跑
cp A/.* B
它会警告您它没有复制.
或..
或任何子目录,但这很好。
或者,如果要一起复制点文件和普通文件,请运行
cp A/.* A/* B
你也可以跑
shopt -s dotglob
cp A/* B
它将起作用bash
,但不起作用sh
。
而且,如果您也不介意子目录也被复制,那么这是最简单的:
cp -R A/ B
提示:如果通配符没有达到您的期望,请尝试使用echo运行它,例如
$ echo A/*
A/file1 A/file2
$ echo A/.*
A/. A/.. A/.hidden1 A/.hidden2
$ echo A/.* A/*
A/. A/.. A/.hidden1 A/.hidden2 A/file1 A/file2
$ shopt -s dotglob
$ echo A/*
A/file1 A/file2 A/.hidden1 A/.hidden2
-R
应该可以正常工作。如果您认为这是错误的,请说明原因。
如果是bash,则可以dotglob
在复制之前进行设置
shopt -s dotglob
cp A/* /destination
或编程语言
$ ruby -rfileutils -e 'Dir[".*"].each {|x| FileUtils.copy(x,"/destination") if File.file?x}'
如果您不想设置dotglob,只需
cp A/.* /destination 2>/dev/null
您正在寻找的是以下方面的产品:
cp A/.??* B/
这将匹配所有点文件,但不匹配“。” 要么 ”..”。只要您不进行递归工作,上述大多数解决方案都可以。但是,只要您想执行以下操作:
cp -R A/.??* B/
在不忽略“ ..”的情况下,您将复制父目录下的所有内容,包括非点文件。
.a
或.x
。我发现最短的匹配模式,除了.
和之外,..
都与每个点文件匹配.[^.]*
。
这不是cp
的错,它的庆典:庆典扩张*
中的所有非隐藏的(即:非开始.
)的文件。
Bash将以所有以开头的文件进行扩展.*
(因此A/.*
,以您的情况.
为准),但是不幸的是,它还会包含.
和..
(当前目录和父目录),您可能希望跳过这些文件。(请注意,其他外壳程序(例如zsh)将不包括它们,并且在设置了某些选项之后,IIRC也会进行bash处理)。
一种简单的解决方案是,以(非常)恶意的方式从.
和..
匹配的文件中删除和删除文件.*
,如下所示:
cp $( for F in A/.*; do echo $F | grep -v "^\.*$"; done ) B
或这一个(可能更干净:它用于find
查找要复制的文件):
cp $( find A -maxdepth 1 -mindepth 1 -name ".*" ) B
但您可能会找到更清洁的解决方案。
如果它们都以点开头,则使用A/.*
:
[holt@Michaela test]$ cp A/* B
cp: cannot stat `A/*': No such file or directory
[holt@Michaela test]$ cp A/.* B
cp: omitting directory `A/.'
cp: omitting directory `A/..'
[holt@Michaela test]$ ls -al B
total 8
drwxrwxr-x. 2 holt holt 4096 2011-03-31 16:57 .
drwxrwxr-x. 4 holt holt 4096 2011-03-31 16:57 ..
-rw-rw-r--. 1 holt holt 0 2011-03-31 16:57 .a
-rw-rw-r--. 1 holt holt 0 2011-03-31 16:57 .b
-rw-rw-r--. 1 holt holt 0 2011-03-31 16:57 .c
希望这可以帮助!
-r
。没有-r
,它将仅跳过目录。