如何复制以点开头的文件?


26

我正在尝试将目录A下的所有文件复制到目录B。目录A下的所有文件都以点开头,例如:

A/.a
A/.b
A/.c

如果我使用了以下命令cp A/* B,就会发现错误:

cp: cannot stat 'A/*': no such file or directory

这似乎不存在用于选择cpls开始点来处理条目,任何人有知道如何解决它?

Answers:


34

原因是,在中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。没有-r,它将仅跳过目录。
Mikel 2014年

我给出的示例也-R应该可以正常工作。如果您认为这是错误的,请说明原因。
Mikel 2014年

7

如果是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

使用dotglob OP'还将复制所有非隐藏文件,这不是他想要的。
peoro 2011年

@peoro,您应该再次阅读问题。中的所有文件A均被隐藏。他只想复制那个。

7

您正在寻找的是以下方面的产品:

cp A/.??* B/

这将匹配所有点文件,但不匹配“。” 要么 ”..”。只要您不进行递归工作,上述大多数解决方案都可以。但是,只要您想执行以下操作:

cp -R A/.??* B/

在不忽略“ ..”的情况下,您将复制父目录下的所有内容,包括非点文件。


1
这会丢失单个字符的点文件,例如.a.x。我发现最短的匹配模式,除了.和之外,..都与每个点文件匹配.[^.]*
pavon 2014年

2

我只是尝试了以下内容,但它的工作原理只是找到...

cp A/.* B/

2
这也将传递A/.A/..作为参数cp,这可能在情况下OP是有问题还需要复制的目录(使用cp -r
peoro

2

这不是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 for loop然后创建额外的grep流程来完成某项工作 cp A/.*cp会忽略“。” 和“ ..”目录。

1

如果它们都以点开头,则使用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

希望这可以帮助!


1

您可以使用此脚本

IFS = $'\ n';用于在$(寻找A -d 1)中行动; 做cp -R“ $ act” B; 完成


0

复制:

cp A/.* B

清单:

ls -l A/.*

列出没有降序目录的文件:

ls -ld A/.*

0

您必须排除。和..从文件列表传递到cp!

这是安全的:

ls -1d A/.[a-zA-Z]* | xargs -i cp -rp {} B

0

这是一个旧线程...但是我一直能够复制所有文件。包括以“。”开头的文件/文件夹。

示例将复制所有文件和文件夹:

cp -aup /root/.* / backup / root /

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.