unix 从所有子目录中复制具有特定扩展名的所有文件

jum4pzuy  于 2022-11-04  发布在  Unix
关注(0)|答案(6)|浏览(125)

在unix下,我想把所有子目录中的所有具有特定扩展名的文件(所有excel文件)复制到另一个目录中。我有以下命令:

cp --parents `find -name \*.xls*` /target_directory/

此命令的问题如下:

  • 它还复制了目录结构,我只需要文件(所以所有文件都应该在/target_directory/中结束)
  • 它不复制文件名中有空格的文件(这是相当多的)

这些问题有什么解决办法吗?

o2gm4chl

o2gm4chl1#

--parents正在复制目录结构,因此您应该删除它。
这样写的话,find就会执行,输出会放到命令行上,这样cp就不能区分文件名之间的空格和文件名 * 中 * 的空格。

$ find . -name \*.xls -exec cp {} newDir \;

其中cpfind找到的每个文件名执行,并正确地传递文件名。Here's more info关于此技术。
您可以使用zsh并简单地输入

$ cp**/*.xls target_directory

zsh可以扩展通配符以包括子目录,并使这类事情变得非常容易。

68bkxrlz

68bkxrlz2#

从以上所有,我想出了这个版本。这个版本也适用于我在mac恢复终端。

find ./ -name '*.xsl' -exec cp -prv '{}' '/path/to/targetDir/' ';'

它将在当前目录和所有子目录中递归查找扩展名为xsl的文件,并将它们全部复制到目标目录。
cp标志为:

  • p -保留文件的属性
  • r -递归
  • v - verbose(显示正在复制的内容)
dbf7pr2w

dbf7pr2w3#

我也遇到过类似的问题。我用以下方法解决了这个问题:

find dir_name '*.mp3' -exec cp -vuni '{}' "../dest_dir" ";"

'{}'";"对每个文件执行复制。

qnzebej0

qnzebej04#

我也必须自己做这个。我是通过--父母对cp的论证来做的:

find SOURCEPATH -name filename*.txt -exec cp --parents {} DESTPATH \;
bxjv4tth

bxjv4tth5#

find [SOURCEPATH] -type f -name '[PATTERN]' | 
    while read P; do cp --parents "$P" [DEST]; done

您可以删除--parents,但如果多个文件具有相同的名称,则存在冲突的风险。

agyaoht7

agyaoht76#

在2022年,zsh解决方案也适用于Linux Bash:

cp**/*.extension /dest/dir

工作正常。

相关问题