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

use*_*285 31 linux bash shell regex

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

A/.a
A/.b
A/.c
Run Code Online (Sandbox Code Playgroud)

我发现如果我使用: cp A/* B,总是得到错误:

cp: cannot stat 'A/*': no such file or directory
Run Code Online (Sandbox Code Playgroud)

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

Mik*_*kel 39

原因是因为 in bash,*不包括以点 ( .)开头的文件。

你可以跑

cp A/.* B
Run Code Online (Sandbox Code Playgroud)

它会警告您它没有复制...,或任何子目录,但这很好。

或者,如果要将点文件和普通文件一起复制,请运行

cp A/.* A/* B
Run Code Online (Sandbox Code Playgroud)

你也可以跑

shopt -s dotglob
cp A/* B
Run Code Online (Sandbox Code Playgroud)

这将在bash,但不是sh

如果您不介意也复制子目录,那么这是最简单的:

cp -R A/ B
Run Code Online (Sandbox Code Playgroud)

提示:如果通配符没有按照您的预期运行,请尝试使用 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
Run Code Online (Sandbox Code Playgroud)


小智 8

如果是bash,可以先设置dotglob再复制

shopt -s dotglob
cp A/* /destination
Run Code Online (Sandbox Code Playgroud)

或者编程语言

$ ruby -rfileutils -e  'Dir[".*"].each {|x| FileUtils.copy(x,"/destination") if File.file?x}'
Run Code Online (Sandbox Code Playgroud)

如果您不想设置 dotglob,只需

cp A/.* /destination 2>/dev/null
Run Code Online (Sandbox Code Playgroud)


小智 8

您正在寻找的更多是:

cp A/.??* B/
Run Code Online (Sandbox Code Playgroud)

这将匹配所有点文件,但不匹配“。” 或者 ”..”。只要您不递归工作,上述大多数解决方案都可以。但是一旦你想做类似的事情:

cp -R A/.??* B/
Run Code Online (Sandbox Code Playgroud)

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