По умолчанию wget пишет в файл, имя которого является последним компонентом URL, который Вы передаете ему. Много серверов перенаправляют URL как http://www.url1.com/app?q=123&gibb=erish&gar=ble
к другому URL с привлекательным именем файла как http://download.url1.com/files/something.pdf
. Можно сказать wget использовать имя от перенаправленного URL (т.е. something.pdf
) вместо app?q=123&gibb=erish&gar=ble
путем передачи --trust-server-names
опция. Это не режим по умолчанию, потому что, если используется небрежно, он мог бы привести к перезаписи непредсказуемого имени файла в текущем каталоге; но если Вы доверяете серверу или работаете в каталоге, содержащем никакие другие драгоценные файлы, --trust-server-names
обычно правильная вещь использовать.
Некоторые серверы используют a Content-Disposition
заголовок вместо перенаправления для определения имени файла. Передайте --content-disposition
опция заставить wget использовать это имя файла.
Таким образом:
wget --content-disposition --trust-server-names -i list_of_urls
Если Вы все еще не получаете привлекательные имена файлов, можно хотеть указать собственное. Предположим, что у Вас есть файл, содержащий строки как
http://www.url1.com/app?q=123&gibb=erish&gar=ble foo.pdf
http://www.url2.com/app?q=111&wha=tcha&mac=allit bar.txt
Чтобы заставить wget загрузить файлы на указанные имена файлов, принимая нет никаких пробельных символов в URL или в именах файлов:
err=0
while read -r url filename tail; do
wget -O "$filename" "$url" || err=1
done <list_of_urls_and_file_names
err
переменная содержит 0, если все загрузки успешно выполнились и 1 иначе, Вы можете return $err
если Вы помещаете этот отрывок в функцию или exit $err
если Вы помещаете этот отрывок в строку.
Если Вы не хотите указывать что-нибудь кроме URL, и Вы не можете получить хорошие имена от сервера, можно предположить тип файла и попытаться получить, по крайней мере, значимые расширения.
err=0
n=1
while read -r url; do
if wget -O tmpfile "$url"; then
ext=data
case $(file -i tmpfile) in
application/pdf) ext=pdf;;
image/jpeg) ext=jpg;;
text/html) ext=html;;
text/*) ext=txt;;
esac
mv tmpfile "$n.$ext"
else
err=1
fi
n=$((n+1))
done
Добавьте другие типы, как желаемый. Если Ваш file
команда не имеет -m
опция, пропустите его и проверьте что file
возвраты в Вашей системе для типов файлов Вы интересуетесь. Если у Вас есть файл /etc/mime.types
в Вашей системе можно считать ассоциации типов MIME к расширениям от него вместо того, чтобы предоставить собственный список:
n=1
while read -r url; do
if wget -O tmpfile "$url"; then
mime_type=$(file -m tmpfile)
ext=$(awk "$1 == \"$mime_type\" {print \$2; exit} END {print \"data\"}" /etc/mime.types)
mv tmpfile "$n.$ext"
else
err=1
fi
n=$((n+1))
done
Я сделал бы это наоборот, запустил бы скрипт, который изменяет расположение. Тем путем можно сделать что-либо еще, что Вы хотите с тем же сценарием. К сожалению, довольно трудно узнать Вас текущая раскладка клавиатуры. Я не нашел подхода, который работает на все методы переключения расположения. По некоторым причинам существует различие, если Вы переключаетесь с setxkbmap
или через ярлыки GUI.
Так, мое обходное решение должно всегда переключать использование setxkbmap
. У меня есть сценарий, который звонит setxkbmap
и я связал тот сценарий с ярлыком в моей настольной среде так, чтобы я мог переключиться легко. Пример ниже для греческого языка и американских разметок, необходимо будет изменить его для установки установке:
#!/usr/bin/env bash
key=`xmodmap -pke | grep -w "59" | awk '{print \$NF}'`
## If this is the "us" layout, that will return "less"
if [ $key == "less" ]; then
setxkbmap gr
## Add other things to be done here
else
setxkbmap us
## Add other things to be done here
fi
dconf watch
может использоваться в качестве получателя события, пример (в Ubuntu 13.10/14.04):
dconf watch /org/gnome/desktop/input-sources/current | xargs -L 2 sh -c "echo kbd layout changed" &
gsettings monitor org.gnome.desktop.input-sources mru-sources \
| xargs -L1 bash -c 'source /path/to/your/script.sh'