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

标签 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 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/

相关文章:

javascript - 返回包含特定值的数组中的整个项目

python - 删除 pandas 系列中以特定字符串开头的所有文本

长字符串上的 Java 正则表达式(字符串缓冲区)

linux - 无关的论据

unix - 在 UNIX 中的特定列中搜索匹配模式的行

regex - 如何使用 Notepad++ 删除每行的最后 13 个(或 n 个)字符

java - 已解决 : JVM hangs forever with no CPU usage or I/O

c++ - 如何设置 eclipse 以使用 arm 的代码源工具链

正则表达式:如何匹配 "sda"但不匹配 "sdaa"?

linux - 如何获得最常出现的 unix 实用程序