#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
Я не очень хорошо понял, какие результаты вам нужны :на всякий случай я скопирую все содержимое всех файлов в один файл, а также создам файл, в котором вы можете найти отчет обо всех основанные файлы.
Пожалуйста, проголосуйте, если было полезно ;)
Есть несколько вещей, которые неудобны с вашим sed
выражением лица.
[^}}]
совпадает с [^}]
и будет соответствовать одному символу , который не является }
. {
и }
используются в расширенных регулярных выражениях (они работают как *
и +
, т. е. указывают, сколько раз должно совпадать предыдущее выражение, как в a{2,4}
для совпадения между 2 и 4a
). Это означает, что некоторые sed
реализации (GNU )будут иметь проблемы с разбором вашего выражения. Здесь я использую базовое регулярное выражение с sed
, и я разрешаю слову в {{ ... }}
содержать любые буквенно-цифровые символы и точки (, которые вы могли бы изменить [[:alnum:].]
на[^ ]
):
$ echo '{{ foo.1 }} {{ foo.2 }}' | sed 's/{{ \([[:alnum:].]*\) }}/{{"{{"}} \1 {{"}}"}}/g'
{{"{{"}} foo.1 {{"}}"}} {{"{{"}} foo.2 {{"}}"}}
Это будет работать как с GNU sed
, так и с BSD sed
(, которые, как я полагаю, вы используете ).
Вы заметите, что выражение sed
выше почти точно такое же, как ваше, за исключением того, что я не использую расширенное регулярное выражение и переместил группу захвата в слово внутри{{ ... }}
(именно так вы удаляете самые внутренние фигурные скобки, которые вы получаете в своем результате ).
Я получаю сообщения об ошибках типа
sed: -e expression #1, char 35: Invalid preceding regular expression
, если вы пытаетесь использовать выше sed
. Попробуйте вместо этого
echo "{{ foo.1 }} {{ foo.2 }}" | sed 's/\({\|}\)\1/{{"&"}}/g'
{{"{{"}} foo.1 {{"}}"}} {{"{{"}} foo.2 {{"}}"}}