Bash: анализирует URL-адреса из файла, обрабатывает их и затем удаляет их из файла.
Я пытаюсь автоматизировать процедуру, при которой система будет извлекать содержимое файла (1 URL-адрес в строке), использую wget, чтобы получить файлы с сайта (папка https), а затем удалить строку из файла.
Я сделал несколько попыток, но часть sed (в конце) не может понять строку (я пытался экранировать символы) и удалить ее из этого файла!
cat File
https://something.net/xxx/data/Folder1/
https://something.net/xxx/data/Folder2/
https://something.net/xxx/data/Folder3/
Моя строка кода:
cat File | xargs -n1 -I @ bash -c 'wget -r -nd -l 1 -c -A rar,zip,7z,txt,jpg,iso,sfv,md5,pdf --no-parent --restrict-file-names=nocontrol --user=test --password=pass --no-check-certificate "@" -P /mnt/USB/ && sed -e 's|@||g' File'
Это работает до sed -e 's|@||g' File
часть..
Заранее спасибо!
4 ответа
@beliy ответы выглядит хорошо!
Если вы хотите однострочно, вы можете сделать:
while read -r line; do \
wget -r -nd -l 1 -c -A rar,zip,7z,txt,jpg,iso,sfv,md5,pdf \
--no-parent --restrict-file-names=nocontrol --user=test \
--password=pass --no-check-certificate "$line" -P /mnt/USB/ \
&& sed -i -e '\|'"$line"'|d' "File.txt"; \
done < File.txt
РЕДАКТИРОВАТЬ: вам нужно добавить \
перед первой трубой
Не используйте кошку, если это возможно. Это плохая практика и могут быть проблемы с большими файлами... Вы можете изменить
cat File | xargs -n1 -I @ bash -c
в
for siteUrl in $( < "File" ); do
Будет правильнее и проще использовать sed с двойными кавычками... Мой вариант:
scriptDir=$( dirname -- "$0" )
for siteUrl in $( < "$scriptDir/File.txt" )
do
if [[ -z "$siteUrl" ]]; then break; fi # break line if him empty
wget -r -nd -l 1 -c -A rar,zip,7z,txt,jpg,iso,sfv,md5,pdf --no-parent --restrict-file-names=nocontrol --user=test --password=pass --no-check-certificate "$siteUrl" -P /mnt/USB/ && sed -i "s|$siteUrl||g" "$scriptDir/File.txt"
done
Я считаю, что вам просто нужно использовать двойные кавычки после sed -e
, Вместо:
'...&& sed -e 's|@||g' File'
вам нужно
'...&& sed -e '"'s|@||g'"' File'
Я вижу, что ты пытаешься сделать, но я не понимаю sed
командование в том числе трубы. Может быть, какой-то необычный формат, который я не понимаю.
В любом случае, я думаю, что команда sed должна выглядеть так...
sed -e 's/@//g'
Эта команда удалит все @ из потока.
Надеюсь, это поможет!