我想确保将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的文件时,无法正确复制它。
答案 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'如果你只想找到文件,而不是目录。