Пакетное переименование заменить частью исходного имени файла DOS и Bash

Я знаю, что это обсуждалось много раз, но я до сих пор не могу найти хорошее решение для этого конкретного аспекта. У меня такая же проблема как в bash, так и в DOS. У меня есть файл из множества файлов .csv с именем abcYYMMDDf.csv, и я хочу изменить имя файла на часть ГГММДД, которая соответствует дате его создания. Обратите внимание на «f» после ГГММДД, так что на самом деле я хотел бы, чтобы эквивалент excel mid() брал среднюю дату.

В bash я понимаю функцию переименования и подстановочный знак *, который я пробовал в вариациях

rename abc*f.csv *.csv abc*

думая, что * заменит ГГММДД, но, очевидно, это не так. Я видел другой метод, включающий выбор s/([a-z]*), но он наверняка взял бы все имя файла?

В ДОС пробовал

ren abc*f.csv *.csv

person stackmeistergeneral    schedule 31.07.2012    source источник


Ответы (4)


Расширение параметра Bash можно использовать для удаления букв «abc» и «f» в два этапа, используя удаление префикса и замену шаблона соответственно.

for f in abc*f.csv; do
    new_f=${f#abc}
    new_f=${new_f/%f.csv/.csv}
    mv $f $new_f
done

Вы можете использовать sed вместо расширения параметра, чтобы удалить «abc» и «f» за один шаг:

for f in abc*f.csv; do
    new_f=$(echo $f | sed 's/abc\(.*\)f/\1/')
    mv $f $new_f
done

Я не могу ответить на версию DOS; возможно, вам лучше задать это в отдельном вопросе.

person chepner    schedule 31.07.2012
comment
Отлично, большое спасибо. Я использовал комбинацию переименования для удаления abc, а затем первую часть вашего ответа для f. Я попробовал второй цикл в первый раз, и он продолжал выдавать мне сообщение об отсутствии выходного файла, есть ли что-то, что я не указал в этом цикле, который вернет это сообщение? - person stackmeistergeneral; 31.07.2012
comment
Как обычно для меня, я сделал ошибку в вызове sed. Фиксированный. - person chepner; 31.07.2012

Для части вопроса «DOS»: если вы работаете в Windows с помощью командной строки (cmd.exe), а не в настоящей DOS с помощью command.com

@echo off
setlocal enableDelayedExpansion
for %%F in (abc*f.csv) do (
  set "name=%%F"
  ren "%%F" "!name:~1,6!.csv"
)


Обновить

Правила работы REN с подстановочными знаками можно найти на странице Как команда Windows RENAME интерпретирует подстановочные знаки?. К сожалению, в этой ситуации правила не помогают.

person dbenham    schedule 31.07.2012
comment
Да, только командная строка, это сработало, спасибо! Я понятия не имел, что эта оболочка может быть такой болью по сравнению с переименованием. - person stackmeistergeneral; 31.07.2012

Для части bash (с двумя шагами):

rename abc "" abc*
rename f.csv .csv *f.csv

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

На втором этапе удаляется завершающая буква «f».

Для части DOS:

Я не думаю, что вы сможете решить это только с помощью переименования. Возможно, стоит взглянуть на некоторые команды Powershell...

person Valentin Huber    schedule 31.07.2012
comment
Хорошо, это звучит просто, но в этом случае есть также f сразу после ГГММДД, я надеялся удалить это в то же время. Кроме того, мне не нужно указывать расширение файла с этими командами? - person stackmeistergeneral; 31.07.2012
comment
Нет, вам не нужно указывать расширения файлов: расширения файлов не имеют внутреннего значения в Linux-подобных системах (насколько я знаю). Конечно, вы можете использовать завершающие расширения для фильтрации с помощью шаблонов подстановок (как это делается в последнем параметре командной строки *f.csv во втором вызове переименования). - person Valentin Huber; 31.07.2012

У меня есть решение для DOS. Вы можете создать нужные строки в Excel, затем скопировать и вставить их в командную строку. Он автоматически выполнит каждую строку, которую вы скопировали в командную строку.

REN "путь к папке\имя файла" "новое имя"

REN "C:\Users\Charlie\Desktop\_Working General\L2795187.HH293.11.xml.csv" "HH293-11.csv"

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

person drunkenvash    schedule 04.02.2016