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

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

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.

  • разрешение отклонено при выполнении двоичного кода
  • Система управления документами для Linux
  • rhel - журналы изменений файлов
  • Как сортировать имена файлов в числовом порядке и измененный порядок времени?
  • Присоединиться: два файла - но только добавить последние два столбца
  • Автоматически определять, когда файл достиг предела размера
  • Поиск файлов в соответствии с метатегами PNG
  • Список (или перемещение) только файлов с определенным количеством строк?
  • 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

    Запись удаленных данных на диск

    Как определить точное время, когда файл был создан и / или изменен?

    В чем разница между тем, чтобы nohup не добавлял «nohup.out» и явно перенаправлял его в файл?

    Как сделать `head` и` tail` на вход с нулевым ограничением в bash?

    В чем разница между устройством цикла и блочным устройством?

    Глобальная конфигурация кэша debootstrap

    Как вызывать привилегии root из запроса пароля в окне «Обновление программного обеспечения»?

    Отсутствует меню на хостинге Mint с использованием RDP, если не войти в систему на консоли хоста

    Установка пакета Почему используется rpm и yum здесь – почему не только один?

    Rsync ssh include & exclude

    tomcat: символическая ссылка в цикле

    Переключение раскладки клавиатуры программно

    Почему я все еще получаю приглашение пароля с помощью ssh с аутентификацией ключа?

    Искать вхождения текста в длинной строке меньше

    Как получить миниатюрный (живой просмотр миниатюр) открытых окон в Linux?

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