ディレクトリ内のファイル全体を検索する[閉じる]

ディレクトリ内のファイル全体を検索する[閉じる]

ファイルに特定の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、抽出したファイルにリストされているファイルを1つのファイルにリンクしたいと思いますdir

答え1

dirこの30,000個のファイルが現在のディレクトリのサブディレクトリにある場合:

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

これにより、リストされているファイルがリンクされ、file1結果がresult.txt

xargsファイル名はここから読み取られ、file1各ファイルに対して実行されます。catコマンドの内容をファイル名に-I XX変更するように指示します。xargsXXcat 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

どんな結果が欲しいのかよくわかりません。すべてのファイルの内容をすべて1つのファイルにコピーし、生成されたすべてのファイルのレポートを見つけることができるファイルも作成しました。

参考になれば投票をお願いします;)

関連情報