我已经搜索了很长时间,但找不到有效的答案。我有一个包含部分文件名的列表(文件名的前几个字母)。如果我按如下方式单独放置文件名,则它可以工作:
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 then 语句的长脚本是唯一的解决方案吗?我一直在使用 Linux,但如果在 mac 上使用它会很酷。
最佳答案
这是一次粗略的尝试,试图通过一次 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 {} +
数组功能需要具有此功能的扩展 shell(Bash、ksh
等);它不适用于 /bin/sh
。
cp -t
是一个 GNU 扩展;如果您没有,也许只需使用原来的 -exec cp {} dir\;
虽然效率较低。某些旧版本的 find
也不支持 -exec ... +
。
关于regex - 如何从包含文件名一部分的列表中 -find -exec cp 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51853222/