复制某个目录下的.txt文件

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每个目录中的文件

Gil*_*il' 5

如果要复制.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, bazandqux并且您只想从barand复制文件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)