如何从包含文件名一部分的列表中查找-exec cp文件

时间:2018-08-15 05:05:16

标签: regex linux grep find xargs

我已经搜索了很长时间,找不到有效的答案。我有一个包含部分文件名(文件名的前几个字母)的列表。如果我按以下方式分别放置文件名,则可以正常工作:

find ~/directory/to/search -name "filename*" -print -exec cp '{}' ~/directory/to/copyto \;

在这种情况下,如果我尝试包括该列表,则不会:

cat ~/directory/List.txt | while read line 
do 
echo "Text read from file - $line" 
find ~/directory/to/search -name "$line*" -type f
done

也不这样做:

cat ~/directory/List.txt | while read line 
do 
echo "Text read from file - $line" 
find ~/directory/to/search -name "$line&*" -type f
done

最终,我想添加:

-exec cp '{}' ~/directory/to/copy/to \;

并复制符合查找条件的所有文件。

我已经尝试过使用grep,但是文件很大,因此要花很多时间。我尝试使用find,xargs,cp,grep和regex的各种组合,就像以前的搜索中读到的一样,没有运气。

使用长串if语句编写长脚本的唯一解决方案是吗?我一直在使用Linux,但是在Mac上使用它也会很酷。

1 个答案:

答案 0 :(得分:0)

这是一次仅凭一次find调用就逃脱的尝试。

predicates=()
or=''
while read -r line; do
    predicates+=($or -name "$line*")
    or="-o"
done < ~/directory/list.txt
find ~/directory/to/search -type f \( "${predicates[@]}" \) \
    -exec cp -t ~/directory/to/copy/to {} + 

阵列功能需要具有此功能的扩展外壳程序(Bash,ksh等);不适用于/bin/sh

cp -t是GNU扩展;如果您没有这样做,也许可以使用原始的-exec cp {} dir \;,尽管效率会降低。 find的某些旧版本也不支持-exec ... +