Bash 在服务器上搜索数百个文件

Bash 在服务器上搜索数百个文件,bash,macos,shell,terminal,Bash,Macos,Shell,Terminal,我有一个577个图像文件的列表,需要在大型服务器上搜索。我不是bash方面的专家,所以我自己能做的最好的是577行: find /source/directory -type f -iname "alternate1_1052956.tif" -exec cp {} /dest/directory \; …对每个文件名重复此行。它是有效的。。。但它的速度令人难以置信,因为它在整个服务器上搜索一个文件,然后转到下一行,但每次搜索可能需要20分钟。我留了一夜,到了早上才找到29个,这太慢了。以这种

我有一个577个图像文件的列表,需要在大型服务器上搜索。我不是bash方面的专家,所以我自己能做的最好的是577行:

find /source/directory -type f -iname "alternate1_1052956.tif" -exec cp {} /dest/directory \;
…对每个文件名重复此行。它是有效的。。。但它的速度令人难以置信,因为它在整个服务器上搜索一个文件,然后转到下一行,但每次搜索可能需要20分钟。我留了一夜,到了早上才找到29个,这太慢了。以这种速度,可能需要两周才能找到所有这些

我尝试用
-o
作为OR分隔符来分隔每一行,希望它能搜索一次577个文件,但我无法让它工作


有人有什么建议吗?我还尝试使用我拥有的文件名的.txt文件作为搜索的基础,但也无法实现。很遗憾,我没有这些文件的路径,只有基本名称。

如果要复制所有
.tif
文件

find /source/directory -type f -name "*.tif" -exec cp {} /dest/directory \;
#                                     ^

在MacOS上,使用将在SpotLight索引中查找文件名的
mdfind
命令。这非常快,因为它只是一个索引查找,就像Linux中的
locate
命令一样:

cp $(mdfind alternate1_1052956.tif) /dest/directory
如果文件中有所有文件名(每个文件一行),请使用xargs

xargs -L 1 -I {} cp $(mdfind {}) /dest/directory < file_with_list 
xargs-l1-I{}cp$(mdfind{})/dest/directory
创建一个包含所有文件名的文件,然后编写一个循环,在该文件中运行并在后台执行命令

请注意,这将占用大量内存,因为您将同时执行多次。因此,请确保您有足够的内存来执行此操作

while read -r line; do
find /source/directory -type f -iname "$line" -exec cp {} /dest/directory \ &;
done < input.file
读取-r行时
;做
find/source/directory-type f-iname“$line”-exec cp{}/dest/directory\&;
完成
这个答案中有一些假设。您有一个所有
577
文件名的列表,我们称之为
inputfile.list
。文件名中没有空格。以下是可能的工作:

$ cat findcopy.sh
#!/bin/bash

cmd=$(
echo -n 'find /path/to/directory -type f '
readarray -t filearr < inputfile.list  # Read the list to an array
n=0
for f in "${filearr[@]}" # Loop over the array and print -iname 
do
    (( n > 0 )) && echo "-o -iname ${f}"  || echo "-iname ${f}"
    ((n++))
done
echo -n ' | xargs -I {} cp {} /path/to/destination/'
)
eval $cmd 

将服务器上的所有文件列成一个列表,将该列表中的577个文件进行grep,创建for循环以将这些文件复制到您想要的位置。为什么
-o-iname
对您不起作用?这只是regex hereNo,我需要搜索特定的文件名。有几十万张图片,我需要577张。我试了一下。我得到错误
第15行:未找到readarray:command
,我相信是指最后一行。这会复制文件,但它会开始从/dest复制所有文件,而不是搜索列表中的特定文件。没有意识到您有一个
MacOSX
。请参阅我的更新说明。我尝试了您的
xargs
,我认为问题在于我没有指定源目录是什么。我CD’ed到我想要搜索的目录,然后运行了这个,但它开始从/Library/Applications和其他各种随机位置复制文件。我拥有的文件列表不包括路径,只包括基本名称,因此有没有一种方法可以让我同时指定源目录?
filearr=($(cat inputfile.list))