tot*_*oto 3 command-line shell filenames file-copy wildcards
我在我的目录中复制我的文件时遇到问题。
我在很多目录中有.txt
和.jpeg
文件,我只想.txt
根据目录复制文件。例如,我有这个:
direct/direct1
direct/direct2
direct1:
file.txt
file2.txt
file.jpeg
file2.jpeg
direct2:
file3.txt
file4.txt
file3.jpeg
file4.jpeg
Run Code Online (Sandbox Code Playgroud)
在我的复制命令中,我只需要.txt
每个目录中的文件
如果要复制.txt
目录中的所有文件,请使用通配符模式:
cp direct/direct1/*.txt target
Run Code Online (Sandbox Code Playgroud)
这会将.txt
目录direct/direct1
中的所有文件复制到目录target
(必须已经存在)。
您可以传递多个模式来从多个目录复制文件:
cp direct/direct1/*.txt direct/direct2/*.txt target
Run Code Online (Sandbox Code Playgroud)
如果要复制 的.txt
所有子目录中的文件direct
,也可以对目录使用通配符:
cp direct/*/*.txt target
Run Code Online (Sandbox Code Playgroud)
如果您只想从某些目录复制,您可以使用仅匹配这些目录的通配符模式。例如,如果direct
有四个子目录foo
, bar
, baz
andqux
并且您只想从bar
and复制文件baz
,则可以使用
cp direct/ba?/*.txt target
Run Code Online (Sandbox Code Playgroud)
到目前为止,没有一个示例从direct
自身复制文件,或从direct
. 如果.txt
要从中复制文件direct
,则需要将其包含在列表中,例如
cp direct/*.txt direct/*/*.txt target
Run Code Online (Sandbox Code Playgroud)
如果您想从direct
、其所有子目录、它们的所有子目录等递归复制文件**
,则可以使用通配符(如果您的 shell 支持)。它在 zsh 中开箱即用,但在bash 中,您需要先使用shopt -s globstar
.
cp direct/**/*.txt target
Run Code Online (Sandbox Code Playgroud)
请注意,所有文件都被复制到target
自身中,这不会重现目录结构。如果要重现目录结构,则需要不同的工具,例如rsync ( tutorial ) 或pax。
rsync -am --include='*.txt' --include='*/' --exclude='*' direct/ target/
cd direct && pax -rw -pe -s'/\.txt$/&/' -s'/.*//' . target/
Run Code Online (Sandbox Code Playgroud)