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

时间:2018-02-23 15:05:12

标签: bash macos shell terminal

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

find /source/directory -type f -iname "alternate1_1052956.tif" -exec cp {} /dest/directory \;

...为每个文件名重复此行。它的工作原理......但它令人难以置信地慢,因为它在整个服务器上搜索一个文件,然后转到下一行,但每次搜索可能需要20分钟。我一夜之间就离开了这里,到了早上才发现其中有29个太慢了。可能需要两周时间才能找到所有这些。

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

有没有人有任何建议?我也尝试使用.txt文件,我有文件名作为搜索的基础,但无法使其工作。不幸的是,我没有这些文件的路径,只有基本名称。

3 个答案:

答案 0 :(得分:0)

如果要复制所有.tif个文件

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

答案 1 :(得分:0)

创建一个包含所有文件名的文件,然后编写一个循环,该循环遍历该文件并在后台执行命令。

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

while read -r line; do
find /source/directory -type f -iname "$line" -exec cp {} /dest/directory \ &;
done < input.file

答案 2 :(得分:0)

在这个答案中有一些假设。您有一个包含所有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 

执行:./findcopy.sh

MacOS的注释。它没有readarray。而是使用任何其他简单方法将列表提供给数组,例如

filearr=($(cat inputfile.list))