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

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

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.

  • Почему я не могу применить этот скрипт к файлам не в моем текущем каталоге?
  • Объяснение непрофессионала для «Все - файл» - что отличается от Windows?
  • как найти смещение одного двоичного файла внутри другого?
  • Как копировать файлы только в папку назначения, находящуюся в папке из источника, все остальное не нужно копировать
  • Переместить файлы и удалить каталоги с помощью rsync?
  • Защищать журнал сеанса от записи другим пользователем
  • Изменение столбца нескольких файлов csv
  • Извлеките один файл из zip-файла, только зная расширение
  • 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

    Есть ли способ просмотра вывода консоли вместо загрузочного логотипа, в то время как моя машина RHEL 6.2 загружается?

    Удалите все файлы в каталогах, кроме тех, чей путь указан в файле

    Встроенная проблема с отображением – Linux Mint на iMac (конец 2009 года)

    Я случайно сломал / bin / bash

    FreeBSD – основные и второстепенные обновления с использованием портов?

    Как установить чувствительность мыши, а не только ускорение мыши?

    Туннельный трафик через другую машину через ssh

    nc -l в фоновом закрытии немедленно закрывается (nc -l 1234 &)

    Bash while loop читает из списка путей, разделенных двоеточиями, используя IFS

    Выберите графическую карту для вывода консоли

    Как запросить статус датчиков рощи?

    Центральный логический узел Rsyslog

    Команда для перечисления всех моноширинных шрифтов, известных как fontconfig

    Неисправность, связанная с gtk / gtk.h, даже если она установлена

    Устранение URL-адресов на сервере

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