Как переименовать файлы с sed и csv

Возможно отобразить несколько часовых поясов при помощи нескольких апплетов Панели Часов Orage.

Под свойствами Orage (щелчок правой кнопкой по часам-> свойства) существует кнопка рядом с 'часовым поясом набора к': маркированный Open. Нажатие той кнопки поднимет окно, которое позволяет Вам выбирать, какой часовой пояс Вы хотите, чтобы тот апплет использовал.

Каждый апплет будет использовать часовой пояс, для которого Вы устанавливаете его.

между прочим, я заметил, что Вы заявляете об использовании Arch на профиле... Orage не установлен с основой xfce пакет в соответствии с Linux Дуги... это - часть метапакета xfce4-положительных-героев:

$ pacman-Ss xfce4-положительные-герои | grep orage

extra/orage 4.8.3-1 (xfce4-положительные-герои) [установлен]

4
06.12.2012, 19:26
4 ответа

Если у Вас, оказывается, есть файл, который похож на это:

old_name1, new_name1
old_name2, new_name2
old_name3, new_name3

Можно сделать грязный небольшой прием:

sed 's/^/mv -vi "/;s/, /" "/;s/$/";/' < names.csv | bash -

Команды sed (разграниченный точками с запятой) делают это (s для замены, / используется в качестве разделителя, любой другой символ сделал бы, @ часто используется также):

  • s/^/mv -vi "/ - добавляет mv -vi " в начале каждой строки (^ начинается строки);
  • s/, /" "/ - запятая замен, сопровождаемая пространством с " ";
  • s/$/";/ - добавляет двойные кавычки ко всем строкам ($ конец средств строки)

и следовательно вывод sed будет это:

mv -vi "old_name1" "new_name1"
mv -vi "old_name2" "new_name2"
mv -vi "old_name3" "new_name3"

который будет питаться к bash выполниться. Кавычки вокруг имен файлов не обязательны, они просто охраняют любые возможные пробелы в именах файлов (однако, они определенно не помогут против пробелов, сопровождаемых запятой, так как это используется в качестве разделителя). -v сообщает mv отобразить то, что это делает (в случае, если что-то идет не так, как надо, Вы будете знать то, что произошло), -i заставит это спрашивать, должно ли это уже было перезаписать существующий файл.

7
27.01.2020, 20:47
  • 1
    я получаю mv: пропавшее место назначения?? –  DᴀʀᴛʜVᴀᴅᴇʀ 06.12.2012, 19:19

В Вашем сценарии существует несколько проблем заключения в кавычки. Это исказит имена файлов, содержащие специальные символы: пробел, \[?*-.

** Всегда используйте двойные кавычки вокруг подстановок переменных "$i" и замены команды "$(sed …)". Без двойных кавычек значение переменной интерпретируется как список разделенных от пробела подстановочных шаблонов, и каждый шаблон заменяется списком соответствия именам файлов (при отсутствии соответствий, шаблон оставлен в покое).

Кроме того, если имя файла начинается -, это будет интерпретироваться как опция mv и возможно echo. Передача -- сначала, чтобы сказать команду, что больше не будет опций.

for i in *.ai; do
  mv -- "$i" "$(printf '%s\n' "$i" | sed 's,a1,b1,')"
done

(Это все еще предполагает, что Ваши имена файлов не содержат новые строки.) (я также зафиксировал sed аргумент в то, что Вы, по-видимому, имели в виду.)


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

while IFS=, read -r from to junk; do
  mv -- "$from" "$to"
done <"$files_to_rename.csv"

Если Ваш входной файл является файлом CSV с возможным заключением в кавычки, используйте реальный синтаксический анализатор CSV. Не пробуйте к самокрутке. Посмотрите там устойчивый инструмент командной строки для обработки файлов CSV? Например, в Python (с CSV на стандартном входе):

import csv, os, sys
for line in csv.reader(sys.stdin):
    (source, dest) = line
    os.rename(source, dest)
3
27.01.2020, 20:47

Если Ваши файлы имеют забавные символы (',",\,$), можно циклично выполниться по файлу и считать его в массив удара.

while IFS=, read -r -a arr; do mv "${arr[@]}"; done <files.csv 
2
27.01.2020, 20:47

Когда сталкивающийся с этим видом проблемы I обычно к sed/bash обманывают вручную.

  1. Я или пишу макрос редактора или глупую небольшую программу, которая читает в файле CSV и пишет строки формы 'mv file1 file2'.
  2. Затем я запускаю скрипт (или макрос) и сохраняю вывод к run-my-cmds.sh
  3. Осмотрите run-my-cmds.sh визуально, чтобы удостовериться, что он будет к правильным вещам
  4. удар run-my-cmds.sh
0
27.01.2020, 20:47

Теги

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