У меня есть группа файлов, которые имеют :
(двоеточие) в имени. Мне нужно заменить :
с -
(тире).
Есть ли простой способ сделать это в сценарии?
Образец FileName: 2013-10-11:11:52:08_055456663_045585_.txt
Простой 1-лайнер должен делать (предполагается, что Posix sh
-совместимая оболочка):
for f in *:*; do mv -v "$f" $(echo "$f" | tr ':' '-'); done
Объяснение:
for ... in ...; do ...; done
это петля
*:*
сопоставляет все файлы и каталоги в текущем каталоге, которые имеют :
в своем имени
f
присваивается по очереди каждому такому имени файла в цикле
mv
переименовывает свой первый аргумент во второй; -v
(многословно) просит его напечатать, что он делает; эта опция специфична для GNU-утилит , поэтому она доступна в Linux, но не в Solaris
echo
выводит свой аргумент в стандартный вывод
tr
читает стандартный вывод и переводит символы в соответствии с прилагаемой картой
Если вы используете bash , вы можете избежать появления дополнительной оболочки ( $()
) с подпроцессами ( tr
) путем замены $(...)
на ${f//:/-}
.
for f in
цикл ... - это цикл, который перебирает все файлы в текущем каталоге, где файлы должны совпадать*:*
. (Что происходит с папками, которые совпадают?). Команда перемещения - это перемещение старого имени на новое имя, в котором новое имя создается путем выполнения оболочки с помощью$( subshell here )
. Что тр, делает ...$(echo "$f" | tr ':' '-')
с"${f//:/-}"
и избежать подоболочку, трубы и внешнего вызова программы. Я думаю, что это башизм, но да. Смотрите здесь .Как указано в другом моем сообщении,
rename
инструмент может помочь вам. Вам просто нужно набратьrename s/:/-/ <files to rename>
Это заменяет каждое двоеточие тире во всех файлах, которые вы называете в конце, т.е.2013-10-*
Вот ссылка на мой другой пост
источник
Я уверен, что UNIX pro мог бы сделать это с bash, но вот моя быстрая и грязная версия с ruby.
установите path_to_files на путь к вашим файлам с ошибочными именами. сохраните приведенный выше код в файле с именем rename.rb, а затем:
источник
Если у вас есть только один или несколько файлов, это может сделать переименование для вас:
p="201*"
.old_name=$(ls | grep $p)
.Сохраните новое имя файла с необходимыми заменами символов:
Бонус очистки :
а. Если для единообразия вы хотите заменить дефисы (
-
) вместе с двоеточиями (:
) на подчеркивание (_
), вы можете сделать это:б. Если вы хотите, чтобы последний знак подчеркивания (непосредственно перед
.txt
) также исчез, установитеnew_name
переменную как:mv $old_name $new_name
NB:
mv
произойдет сбой, если в нем есть какое-либо из имен файлов в операции переименованияspaces
. В этом случае оберните соответствующие переменные в кавычки, например:mv "$old_name" $new_name
ИЛИmv $old_name "$new_name"
ИЛИmv "$old_name" "$new_name"
Однострочники
источник
используя renamer :
источник
rename
это инструмент, который предустановлен во многих дистрибутивах Linux. Но я думаю, что для Windows этот инструмент может быть отличным.Это может быть излишним, но вы можете переименовать любые специальные символы с помощью скрипта по ссылке, приведенной в этом ответе:
/superuser//a/858671/365691
источник