我在复制目录中的文件时遇到问题。
我有很多目录中的文件,我只想根据目录复制.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
有四个子目录foo
、bar
、baz
和qux
并且您只想从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