我已经搜索了很长时间,找不到有效的答案。我有一个包含部分文件名(文件名的前几个字母)的列表。如果我按以下方式分别放置文件名,则可以正常工作:
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上使用它也会很酷。
答案 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 ... +
。