Как насчет того, чтобы использовать два различных конфигурационных файла для tsocks?
Согласно этой странице справочника, tsocks прочитает свою конфигурацию из файла, указанного в TSOCKS_CONF_FILE
переменная среды. Таким образом, Вы могли разделить Ваш tsocks.conf
кому: tsocks.1081.conf
и tsocks.1082.conf
и затем сделайте что-то вроде этого (колотите синтаксис):
$ TSOCKS_CONF_FILE=/path/to/tsocks.1081.conf tsocks wget http://www.google.com
$ TSOCKS_CONF_FILE=/path/to/tsocks.1082.conf tsocks wget http://www.google.com
Примечание: Страница справочника имеет опечатку и перечисляет переменную среды как TSOCKS_CONFFILE
- пропавшие без вести подчеркивания.
Это должно работать:
sh <(sed -r 's/^\s*(.*)\s+([0-9\.]+)\s+([0-9A-Z]{8}\.dat)\s*$/mv -iv \3 "\2 \1"/' files)
... где files
название Вашего исходного файла.
То, что это делает, передать результат sed
управляйте к новому экземпляру sh
(оболочка), с помощью замены процесса. Вывод sed
команда:
mv -iv 000011F4.dat "0.1 New File Name.xlsx"
mv -iv 000011F5.dat "0.2 New File Name.xlsx"
mv -iv 000011F6.dat "0.3 New File Name.xlsx"
mv -iv 000011F7.dat "0.4 New File Name.xlsx"
mv -iv 000011F8.dat "0.5 New File Name.xlsx"
mv -iv 000011F9.dat "0.6 New File Name.xlsx"
Взятие sed
управляйте независимо, это ищет шаблон:
^
- начало строки\s*
- любой пробел в запуске(.*)
- любые символы (круглые скобки хранят результат к \1
)\s+
- по крайней мере один пробельный символ([0-9\.]+)
- по крайней мере один из 0-9
и .
(сохраненный к \2
)\s+
- по крайней мере один пробельный символ([0-9A-Z]{8}\.dat)
- 8 символов в 0-9
или A-Z
, сопровождаемый .dat
(сохраненный к \3
)\s*
- любой пробел в конце$
- конец строки... и замены это с mv -iv \3 "\2 \1"
, где \1
кому: \3
ранее сохраненные значения. Можно использовать что-то другое, чем пространство между номером версии и остальной частью имени файла, если Вам нравится.
Вот результат:
$ ls -l
total 60
-rw-rw-r-- 1 z z 0 Aug 8 14:15 000011F4.dat
-rw-rw-r-- 1 z z 0 Aug 8 14:15 000011F5.dat
-rw-rw-r-- 1 z z 0 Aug 8 14:15 000011F6.dat
-rw-rw-r-- 1 z z 0 Aug 8 14:15 000011F7.dat
-rw-rw-r-- 1 z z 0 Aug 8 14:15 000011F8.dat
-rw-rw-r-- 1 z z 0 Aug 8 14:15 000011F9.dat
-rw-rw-r-- 1 z z 222 Aug 8 13:47 files
$ sh <(sed -r 's/^\s*(.*)\s+([0-9\.]+)\s+([0-9A-Z]{8}\.dat)\s*$/mv -iv \3 "\2 \1"/' files)
`000011F4.dat' -> `0.1 New File Name.xlsx'
`000011F5.dat' -> `0.2 New File Name.xlsx'
`000011F6.dat' -> `0.3 New File Name.xlsx'
`000011F7.dat' -> `0.4 New File Name.xlsx'
`000011F8.dat' -> `0.5 New File Name.xlsx'
`000011F9.dat' -> `0.6 New File Name.xlsx'
$ ls -l
total 60
-rw-rw-r-- 1 z z 0 Aug 8 14:15 0.1 New File Name.xlsx
-rw-rw-r-- 1 z z 0 Aug 8 14:15 0.2 New File Name.xlsx
-rw-rw-r-- 1 z z 0 Aug 8 14:15 0.3 New File Name.xlsx
-rw-rw-r-- 1 z z 0 Aug 8 14:15 0.4 New File Name.xlsx
-rw-rw-r-- 1 z z 0 Aug 8 14:15 0.5 New File Name.xlsx
-rw-rw-r-- 1 z z 0 Aug 8 14:15 0.6 New File Name.xlsx
-rw-rw-r-- 1 z z 222 Aug 8 13:47 files
sed 's/^\(.*\.xlsx\) \+\([[:digit:]]\+\.[[:digit:]]\+\) \+\(.[^ ]*\)/"\3" "\2\1"/' \
<file_list | xargs -n 2 mv
Это делит строку на часть прежде .xlsx
, который является второй частью нового имени, которое становится доступным как \1
. Это захватывает версию и присваивает ее \2
. Затем прибывает старое имя файла, игнорируя конечный пробел.
Это заключается предоставленный в кавычки mv
как аргумент. -n 2
гарантирует это mv
получает два аргумента, старое и новое имя файла.
Пробелы не создают проблемы, что усложняет ситуацию, то, что Ваш входной список не хорошо структурирован. Если столбцы были бы подкачаны, и имена файлов заключаются в кавычки, Вы могли бы просто использовать xargs
и mv
, без предшествующего управления.
Пробелы в имени файла и использование нескольких пробелов между некоторыми столбцами, делают это тяжелее, но ни в коем случае не непреодолимый.
Считайте файл списка линию за линией. Обычно можно было бы использовать while IFS= read -r; do …
, но здесь это могло бы быть более устойчиво для разделения ведущего и запаздывающего пробела. Для каждой строки:
[[:space:]]+
соответствия один или несколько пробельный символ (пространство или вкладка); [[:space:]]+
соответствия один или несколько непробельных символов. Заключенные в скобки группы могут быть получены через BASH_REMATCH
переменная.${VAR##PATTERN}
и ${VAR%PATTERN}
снимать изоляцию с префикса или суффикса от переменной соответственно.Соединение всего этого:
ret=0
while read line; do
if [[ $line =~ (.*[^[:space:]])[[:space:]]+([^[:space:]]+)[[:space:]]+([^[:space:]]+) ]]; then
new_name="${BASH_REMATCH[1]}"
version="${BASH_REMATCH[2]}"
old_name="${BASH_REMATCH[3]}"
mv -- "$old_name" "$version$new_name" || ret=1
else
echo "Malformed line: $line"
fi
done <name_list.txt
exit $ret
awk
решение состоит в том, чтобы выполнить эту команду:
awk '{print "/bin/mv", $NF, "\"" $(NF-1), gensub(/^([^.]+\.xlsx).*/, "\\1", 1) "\"" | "bash" } ; END { close("bash") }' sourcefile
Предыдущая команда передает bash
окружите вывод команды:
awk '{print "/bin/mv", $NF, "\"" $(NF-1), gensub(/^([^.]+\.xlsx).*/, "\\1", 1) "\""}' sourcefile
который должен быть выполнен сначала, чтобы удостовериться, что это действительно, что Вы хотите выполнить! Это awk
управляйте печатью, для каждой строки в исходном файле, /bin/mv
команда, сопровождаемая последним разграниченным пробелом полем в строке, сопровождаемой двойной кавычкой, сопровождаемой предпоследним полем в строке, сопровождаемой результатом замены всей строки всем через строку .xlsx
, сопровождаемый двойной кавычкой.
Вот вариант, который Вы могли бы предпочесть:
awk '{print "/bin/mv", $NF, "\"" "0." FNR, gensub(/^([^.]+\.xlsx).*/, "\\1", 1) "\"" | "bash" } ; END { close("bash") }' sourcefile
Переменная FNR
номер строки (таким образом, можно опустить от исходного файла записи 0.1, 0.2, 0.3...).
Пробел в именах файлов не то, что я назвал бы “серьезной проблемой”, но я рекомендую против него. Вы могли использовать что-то вроде этого окончательная версия, которая изменяет пробелы на символы нижнего подчеркивания в Ваших новых именах файлов:
awk '{print "/bin/mv", $NF, "0." FNR "_" gensub(" ","_", "g", gensub(/^([^.]+\.xlsx).*/, "\\1", 1)) | "bash" } ; END { close("bash") }' sourcefile
sed -r 's/^\s*(.*)\s+([0-9\.]+)\s+([0-9A-Z]{8}\.dat)\s*$/mv -iv \3 "\2 \1"/' files
безsh <(...)
часть. – 09.08.2013, 18:07