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)
这似乎不存在用于选择cp的ls开始点来处理条目,任何人有知道如何解决它?
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)
在不省略“..”的情况下,您将从父目录向下复制所有内容,包括非点文件。
| 归档时间: |
|
| 查看次数: |
27917 次 |
| 最近记录: |