Сценарий Bash для переименования файлов из источника текстового файла

Как насчет того, чтобы использовать два различных конфигурационных файла для 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 - пропавшие без вести подчеркивания.

6
08.08.2013, 21:20
4 ответа

Это должно работать:

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
7
27.01.2020, 20:23
  • 1
    Большое спасибо. Вы убрались подобру-поздорову, я также ценю сопроводительное объяснение, хорошо видеть то, что продолжается в команде перед выполнением его. Чтобы быть полностью честным, я все еще не на 100% уверен, что происходит. Это использует вид синтаксиса, который Вы видели бы в регулярном выражении? Строго говоря, я не вполне понимаю, как это определило переменные/1 / 2 и/3 Спасибо также к другим ответам, я ценю справку! унисон –  user2472419 09.08.2013, 01:19
  • 2
    На самом деле это работало, когда я протестировал его дома вчера вечером, но не работал сегодня в производстве. По-видимому, существует проблема с/dev/fd/63. Я просмотрел к нему, и это не существует, никакие идеи никто? Google не был большим количеством справки на этом.Удачи. –  user2472419 09.08.2013, 18:04
  • 3
    Что Вы получаете, если Вы не делаете замены процесса? То есть просто выполненный 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
  • 4
    Извините за задержку в ответ и еще раз спасибо за Вашу справку с этим. Если я выполняю команду как выше, я получаю синтаксическую ошибку: удар: синтаксическая ошибка около неожиданного маркера')' –  user2472419 12.08.2013, 11:12
  • 5
    На самом деле это действительно выполнялось, я забыл удалять последнее). Однако ничто, кажется, не было переименовано, я получаю большой список команд mv после того, как он выполнился, но все файлы остаются неизменными –  user2472419 12.08.2013, 11:27
sed 's/^\(.*\.xlsx\) \+\([[:digit:]]\+\.[[:digit:]]\+\) \+\(.[^ ]*\)/"\3" "\2\1"/' \
  <file_list | xargs -n 2 mv

Это делит строку на часть прежде .xlsx, который является второй частью нового имени, которое становится доступным как \1. Это захватывает версию и присваивает ее \2. Затем прибывает старое имя файла, игнорируя конечный пробел.

Это заключается предоставленный в кавычки mv как аргумент. -n 2 гарантирует это mv получает два аргумента, старое и новое имя файла.

Пробелы не создают проблемы, что усложняет ситуацию, то, что Ваш входной список не хорошо структурирован. Если столбцы были бы подкачаны, и имена файлов заключаются в кавычки, Вы могли бы просто использовать xargs и mv, без предшествующего управления.

4
27.01.2020, 20:23

Пробелы в имени файла и использование нескольких пробелов между некоторыми столбцами, делают это тяжелее, но ни в коем случае не непреодолимый.

Считайте файл списка линию за линией. Обычно можно было бы использовать while IFS= read -r; do …, но здесь это могло бы быть более устойчиво для разделения ведущего и запаздывающего пробела. Для каждой строки:

  • Повредите каждую строку в три части. Один способ сделать, который является с соответствием regex. [[: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
1
27.01.2020, 20:23

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
0
27.01.2020, 20:23

Теги

Похожие вопросы