【问题标题】:How to -find -exec cp files from a list containing a portion of the filename如何从包含部分文件名的列表中查找 -exec cp 文件
【发布时间】:2019-01-22 00:10:40
【问题描述】:

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

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 上使用它也会很酷。

【问题讨论】:

  • 您尝试的输出是什么,您要查找的文件名是什么?
  • 我无法复制这个。 while read name; do find . -name "$name*"; done <<<foo 按预期工作,找到 foo.txt
  • “它不起作用”是最糟糕的问题描述。 “嘿,机械师,我的车坏了——这是它的照片,现在告诉我它出了什么问题”。告诉我们它以何种方式“不起作用” - 错误输出、无输出、错误消息、核心转储或其他?
  • @Jon 看来您的尝试与我上面的第一次尝试类似。我尝试使用:while read line; do find . -name "$line&*" \; ; done < ~/data/Studies/EST/ESTlist.txt,但遇到了:find: paths must precede expression: 错误。
  • @RLz 啊,那是因为\;,它不是必需的(它是-exec 选项的终结符)。把它拿出来,你可能会很好。另外,$line&* 应该只是$line* 吗? & 不需要在 Bash 中连接。

标签: regex linux grep find xargs


【解决方案1】:

这是一次简单的 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 ... +

【讨论】:

  • 你可能想在测试时用cp -v rwn 这个,这样你就可以看到它在做什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-07
  • 2011-11-18
  • 1970-01-01
  • 2017-09-26
  • 2022-12-22
  • 2017-01-13
相关资源
最近更新 更多