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

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

我在复制目录中的文件时遇到问题。

我有很多目录中的文件,我只想根据目录复制.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

在我的复制命令中,我只需要.txt每个目录中的文件

答案1

如果要复制.txt目录中的所有文件,请使用通配符模式:

cp direct/direct1/*.txt target

这会将.txt目录中的所有文件复制direct/direct1到该目录target(该目录必须已存在)。

您可以传递多个模式来从多个目录复制文件:

cp direct/direct1/*.txt direct/direct2/*.txt target

如果要复制.txt的所有子目录中的文件direct,也可以对该目录使用通配符:

cp direct/*/*.txt target

如果您只想从某些目录进行复制,则可以使用仅匹配这些目录的通配符模式。例如,如果direct有四个子​​目录foobarbazqux并且您只想从bar和复制文件baz,则可以使用

cp direct/ba?/*.txt target

到目前为止,所有示例都没有从direct自身或direct.如果您想.txt从 复制文件direct,则需要将其包含在列表中,例如

cp direct/*.txt direct/*/*.txt target

如果您想递归地从direct、其所有子目录、其所有子目录等复制文件,则可以使用通配符**(如果您的 shell 支持)。它在 zsh 中开箱即用,但在巴什,您需要先使用 启用它shopt -s globstar

cp direct/**/*.txt target

请注意,所有文件都被复制到target自身中,这不会重现目录结构。如果要重现目录结构,则需要不同的工具,例如同步(教程) 或者帕克斯

rsync -am --include='*.txt' --include='*/' --exclude='*' direct/ target/
cd direct && pax -rw -pe -s'/\.txt$/&/' -s'/.*//' . target/

答案2

您可以使用find仅选择某个目录下的`.txt 文件:

find direct/direct? -name "*.txt"

这会打印出所有文件,这样你就可以检查你是否得到了你想要的文件,并且不会选择太多。必须*.txt加引号,否则 shell 会尝试将其扩展为.txt当前目录中的文件。

至于复制,您(最常见)需要执行以下两件事之一:.txt是否保留直接到文件的路径。要保存它,请使用:

find direct/direct? -name "*.txt" -print0 | cpio -pdmv0 target_directory

要将所有.txt文件复制到一个目标目录中,请使用类似于 @lambert 建议的内容:

find direct/direct? -name "*.txt" -exec cp {} target_directory +

(使用+而不是更有效,因为使用时\;将多个文件名传递给单个文件,而不是在使用时为每个文件调用a )cp+cp\;

对于第二个命令,-print0不需要处理带有特殊字符的路径,替换的文件名通过调用{}方式正确分隔。cp

相关内容