Может кто-нибудь подсказать, как переименовать имя файла:
head.body.date.txt
Для того, чтобы:
head_body_date.txt
Есть ли однострочный оператор для переименования в Unix ?
Может кто-нибудь подсказать, как переименовать имя файла:
head.body.date.txt
Для того, чтобы:
head_body_date.txt
Есть ли однострочный оператор для переименования в Unix ?
.tar.gz
это расширение? Кроме того, добро пожаловать в U & L!mv head.body.date.txt head_body_date.txt
. Если у вас есть другие ограничения или реальные примеры, пожалуйста, обновите ваш вопрос с ними. В настоящее время неясно, относится ли вопрос к файлу с таким явным именем, к единственному каталогу, в котором все файлы имеют определенный формат, или вы хотите найти иерархию каталогов для конкретных имен и изменить их.Ответы:
Переберите имена файлов и используйте расширение Parameter для преобразования:
Шаблон расширения параметра
${f//./_}
заменяет все.
s на_
s в имени файла ($f
).Выше приведен пробный прогон, чтобы фактическое переименование произошло, удалите
echo
:Если вы хотите иметь дело с любым расширением, а не просто
.txt
:После проверки удалите
echo
для фактического действия:Общий, для произвольного числа точек, хотя бы одна:
источник
for f in *.*; do ...; done
*.*
образец прямо в пример, поскольку теперь код выглядит так, как будто он работает только с фиксированным числом точек.с
perl
основаннымrename
\.[^.]+$(*SKIP)(*F)
пропустите этот шаблон и ищите альтернативные совпадения|\./_/g
заменить все.
на_
Или, используя негативный взгляд
Как только это будет в порядке, удалите
-n
опциюисточник
Использует регулярное выражение, чтобы найти все, кроме последнего экземпляра
.
в имени файла (без захвата), и заменить их на_
. Обобщает,*.*
если хотите.(эта конкретная версия
rename
кажется установлена черезutil-linux
). Я пользуюсьUbuntu 12.04
(да, сильно устаревшая машина).источник
bash
:источник
mv --
, чтобы защититься от «старых» имен файлов, которые начинаются с-
. (2) Вы должны поместить$old
в кавычки ("$old"
), чтобы защититься от «старых» имен файлов, которые содержат пробелы или символы, которые являются специальными для оболочки (например,*
и?
). (3) Ваш ответ терпит неудачу в несколько патологическом случае, когда расширение содержит подчеркивание:head.body.date.t_xt
переименовывается вhead_body_date_t.xt
.Использование
mv
,sed
иrev
в одной строке:Если вы хотите применить его ко всем
txt
файлам в текущем представлении, использование globs кажется сложным из-за тогоmv
, как работает, но вы можете сделатьfor
цикл в одну строку:Чуть дольше, но вы можете сопоставить несколько шаблонов в вашем цикле!
источник
$(ls …)
; просто делайfor file in *.txt
. (2) Вы должны использовать больше цитаты:mv "$file" "$(…)"
.rename
как некоторые другие предложили в своих ответах, звучит проще, хотя ...Это так же просто, как и для одного файла за раз. Вы не указываете, хотите ли вы, чтобы это делалось рекурсивно внутри каталога или для всего каталога, так что это было бы вашим наиболее удобным и быстрым решением.
источник