ファイルに特定の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
変更するように指示します。xargs
XX
cat 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つのファイルにコピーし、生成されたすべてのファイルのレポートを見つけることができるファイルも作成しました。
参考になれば投票をお願いします;)