当find提供文件时,如何在文件名中包含空格的cp文件

时间:2015-03-10 20:47:31

标签: linux bash

我想确保将find找到的所有文件都按照给定的条件正确地复制到所需的位置。

$from = '/some/path/to/the/files'
$ext  = 'custom_file_extension'
$dest = '/new/destination/for/the/files/with/given/extension'

cp 'find $from -name "*.$ext"' $dest

这里的问题是,当找到具有适当扩展名且包含空格cp的文件时,无法正确复制它。

5 个答案:

答案 0 :(得分:3)

你不这样做。你不能用这样的空格来展开文件名。

您可以使用http://mywiki.wooledge.org/BashFAQ/001中的内容来逐行查找输出,也可以使用{{1>}来查找数组中的输出来执行复制工作

这样的事情:

find -exec

这里使用from='/some/path/to/the/files' ext='custom_file_extension' dest='/new/destination/for/the/files/with/given/extension' find "$from" -name "*.$ext" -exec cp -t "$dest" {} + 意味着-exec command +只会根据命令长度限制执行所需的find个命令。在这里使用cp将运行一个-exec command ; - 每个文件找到(但更容易移植到旧系统)。

请参阅gniourf_gniourf关于在cp命令中使用-t以使cp正常工作的评论。

答案 1 :(得分:1)

使用-exec

find "$from" -name "*.$ext" -exec cp {} "$dest" \;

答案 2 :(得分:0)

您需要逐个复制文件:

for file in "$from"/*."$ext"; do
    cp "$file" "$dest"
done

我只是在这里使用glob,它足够完整。我认为如果文件名包含有趣的字符,find可能会引入问题。

答案 3 :(得分:0)

此类问题的解决方案是xargs -0-print0的{​​{1}}标记。

find指示查找使用NUL字符终止而不是换行来打印结果,而-print0的{​​{1}}告诉它希望以该格式输入。

最后,xargs的-J选项允许将参数放在正确的位置以供复制。

-0

答案 4 :(得分:0)

最好使用find命令的-exec参数来执行此操作:

find . -type f -name "*.ext" -exec cp {} ./destination_dir \;

我已经用包含空格的文件检查了这个案例,这对我来说很有用。也不要伪造指出' -type f'如果你只想找到文件,而不是目录。