搜索目录中的整个文件

搜索目录中的整个文件

我在一个文件中有一些特定 ID 的列表。

file1

10012074
10182922
10193829
10213367
10302542
10332316
10492906
10592572
10606805
10627446
10681600
10697905
10758584
10882944
10919833
10921530
11021848

该目录下有 30,000 个文件dir。部分文件预览:

16320386  23505634  31404647  40262433  49727240  59977762  72739048
16321609  23507673  31409545  40263912  49731993  59983079  72743197
16321830  23508959  31410806  40274881  49733838  59991144  72743532
16323719  23513175  31413679  40277233  49737047  60000337  72743644
16324483  23513237  31415413  40280305  49739812  60006875  72746735
16325027  23514404  31421015  40283351  49741053  60017537  72748827
16326681  23516543  31422747  40288023  49752294  60022678  72751898
16327485  23517971  31427324  40290554  49752684  60023962  72752027
16333225  23518024  31427909  40291536  49755190  60025125  72754762
16334779  23520574  31428484  40291746  49756105  60029433  72755014
16336857  23522410  31430611  40293529  49756156  60034076  72757030

从该目录中取出与 .txt 的内容匹配的同名文件file1

澄清:我想要file1包含 30,000 个文件的目录的所有相关上下文并合并到一个新文件中。换句话说file1,我想将提取的文件中列出的文件连接dir到一个文件中。

答案1

如果这30000个文件位于dir当前目录的子目录中:

xargs -I XX cat dir/XX <file1 >result.txt

这将连接 中列出的文件file1并将结果写入名为 的文件中result.txt

xargs将从中读取文件名并对每个文件file1执行。cat指示将命令中的内容-I XX替换xargs为文件名。XXcat dir/XX

您还可以使用

cd dir
xargs cat <../file1 >../result.txt

这可能更快,但给出相同的结果。不同之处在于,不是cat单独对每个文件运行一次,而是cat使用尽可能多的文件名进行调用。

答案2

输入 - 文件 1 输出 - 文件 2

假设包含 ID 的目录位于 file1 所在的同一目录中。

cat file1 | while read line ; do cat ./*/$line  >> file2.txt 2> /dev/null; done

答案3

#Sorry for my english
#Maybe you need execute this script with "sudo"
#Keep attention in the urls, you must set properly the last '/' . Example: /search_directory/
#In my case I am testing in the same directory where i am executing the scripts, that is the
#reason why DirectoryWhereToSearch is empty and BackupDirectory doesn't contain any '/'

FileListName="filelist.txt"     #File which contain de list of IDs
DirectoryWhereToSearch=""           #Url of directory where search for files
BackupDirectory="./FoundedFiles"    #Url of directory where to copy the matches files
FileResume="Resume.txt"         #Contain a resume of the results
FileContainAllFiles="AllInOne.txt"  #This file contain the content of all the founded files.

if [ -f $FileResume ]; then
    rm -r $FileResume
fi

if [ -f $FileContainAllFiles ]; then
    rm -r $FileContainAllFiles
fi

touch $FileResume
touch $FileContainAllFiles 

if [ -d $BackupDirectory ]; then
    rm -rf $BackupDirectory
fi
mkdir $BackupDirectory

if [ -f $FileListName ]; then   #If the file which contain all the IDs exist

    #This while search for the files and copy all the match files.
    while read ID
    do
        echo "Searching for file with ID=$ID"
        search=$(find $DirectoryWhereToSearch -type f -iname "*$ID*")
        if [ "$search" == "" ]; then
            echo "File not founded: $ID"
            echo "File not founded: $ID" >> $FileResume
        else 
            echo "File Founded: $search"
            echo "File Founded: $search" >> $FileResume
            cp -rf $search $BackupDirectory 2>/dev/null
            cat $search >> $FileContainAllFiles
        fi
        echo "--------------------------------"
    done < $FileListName

else
    echo "IDs file does not founded"
fi

我不太明白您需要哪种结果:以防万一我将所有文件的所有内容复制到一个文件中,并且我还创建了一个文件,您可以在其中找到所有已创建文件的报告。

如果有帮助,请投票;)

相关内容