Переименование файлов с помощью списка

У меня есть файлы, доступные в каталоге:

filename15_1 filename15_2 filename15_3 filename15_4 

И так далее.

У меня есть другой файл, который содержит информацию о том, как я хочу переименовать файлы. Это файл CSV.

 filename15_1,filename30_6 filename15_2,filename30_7 filename15_3,filename60_3 filename15_4,filename60_4 filename15_5,filename60_5 filename15_6,filename60_6 

Я хочу переименовать четыре файла, прочитав приведенное выше сопоставление. Файлы сопоставления имеют больше информации, чем фактические файлы, присутствующие в каталоге.

Мои файлы должны быть переименованы в следующее.

 filename30_6 filename30_7 filename60_3 filename60_4 

Как я могу это сделать?

Примечание. Я являюсь человеком с базой данных и мало знаю об Unix.

  • Как я могу использовать переименование для рекурсивного переименования в верхний регистр
  • как создать много tar-архивов для огромной папки
  • временная метка, время модификации и время создания файла
  • Почему происходит перебор находок на выходе плохой практики?
  • Как сообщить gzip о сохранении исходного файла?
  • копировать файлы на новое имя - кратчайший путь
  • как найти смещение одного двоичного файла внутри другого?
  • Есть ли способ отменить команду терминала?
  • 5 Solutions collect form web for “Переименование файлов с помощью списка”

    Если ваш файл сопоставления разделен запятой, вы можете сделать это:

     while IFS=, read orig target; do mv "$orig" "$target" done < mapping.txt 

    Ну, довольно глупый ответ, но:

     sed -e 's/^/mv /' -e 's/,/ /' $mapping_file | sh 

    С xargs который поддерживает -0 (и считая, что единственная запятая в каждой строке является разделителем):

     tr \\n, \\0 <mapping.txt | xargs -0 -n2 mv 

    читаемым, сжатым подходом была бы system функция awk

     awk -F',' 'system("mv " $1 " " $2)' mappingFile.csv 

    который будет запускать команду для каждой строки входного файла


    краткое изложение команды

    • awk unix util, отлично подходит для обработки табличных данных
    • -F',' разделитель F ield является запятой
    • system("mv " $1 " " $2) выполняется для каждой строки входного файла
      • system(x) запустит x в подоболочке
      • $1 и $2 относятся к первому и второму столбцам соответственно
      • "mv " $1 " " $2 неявная конкатенация строит команду
    • mappingFile.csv использует этот входной файл

    С помощью приведенных выше ответов я модифицировал код следующим образом и работает.

     cd $SRCE for file in * do while IFS="," read srce target do if [[ $file = $srce ]] ; then mv "$srce" "$target" fi done < map_lst done 
    Interesting Posts

    Шифрование раздела с символическими ссылками

    Я получаю «Имя или услугу неизвестно» в Linux Kali при подключении с адаптером Virtualbox Bridged Adapter

    Карта нестандартных скрытых отчетов для scancodes для игровой клавиатуры Logitech G105

    Как запустить прямой эфир в качестве локального радио

    Удалить кнопку «Свернуть» в Openbox

    Обои для рабочего стола TTY / Console

    Чтобы восстановить данные OSX в Debian

    Доступ к кешу файловой системы, который не находится в оперативной памяти, но диск на диске уже выпущен

    Управление другой установкой Linux на другом разделе на одном компьютере

    Что случилось с моей установкой Arch? Случайный причудливый экран с момента последнего обновления

    pwd без символических ссылок

    Отключение опции зеркала в preseed.cfg

    HTTPd показывает PHP-код вместо его выполнения

    извлекать блоки текста из XML-файла

    Найти список каталогов на один уровень в глубину от соответствующего каталога

    Linux и Unix - лучшая ОС в мире.