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'

Эта команда удалит все @ из потока.
Надеюсь, это поможет!

Другие вопросы по тегам