我有一个577图像文件的列表,我需要在大型服务器上搜索。在bash方面我不是专家所以我能做的最好的就是577行:
find /source/directory -type f -iname "alternate1_1052956.tif" -exec cp {} /dest/directory \;
...为每个文件名重复此行。它的工作原理......但它令人难以置信地慢,因为它在整个服务器上搜索一个文件,然后转到下一行,但每次搜索可能需要20分钟。我一夜之间就离开了这里,到了早上才发现其中有29个太慢了。可能需要两周时间才能找到所有这些。
我尝试将每一行用-o
分隔为OR分隔符,希望它能搜索一次577个文件,但我无法让它工作。
有没有人有任何建议?我也尝试使用.txt文件,我有文件名作为搜索的基础,但无法使其工作。不幸的是,我没有这些文件的路径,只有基本名称。
答案 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))