【发布时间】: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