我在一个文件中有一些特定 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
为文件名。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
我不太明白您需要哪种结果:以防万一我将所有文件的所有内容复制到一个文件中,并且我还创建了一个文件,您可以在其中找到所有已创建文件的报告。
如果有帮助,请投票;)