Відповіді:
Простий 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//:/-}
.
$(echo "$f" | tr ':' '-')
з "${f//:/-}"
і уникнути подоболочкі, труби і зовнішнього виклику програми. Я думаю, що це башизм, але так. Дивіться тут .
Я впевнений, що UNIX Pro може це зробити з bash, але ось моя швидка і брудна версія з рубіном.
path_to_files = "/home/username/wrongnames/"
filenames = `ls #{path_to_files}`.split
filenames.each do |fn|
`mv #{path_to_files + fn} #{path_to_files + fn.gsub(/:/, "-")}`
end
встановіть path_to_files до шляху до ваших неправильно названих файлів. збережіть наведений вище код у файлі під назвою rename.rb:
username@machinename$ ruby rename.rb
Якщо у вас є лише один або кілька файлів, це може зробити перейменування для вас:
p="201*"
.old_name=$(ls | grep $p)
.Збережіть нове ім’я файлу з необхідними символьними замінами:
new_name=$(ls | grep $p | sed 's/:/_/g') # Using 'sed'
OR
new_name=$(ls | grep $p | tr ':' '_') # Using 'tr'
Прибирання бонусів :
a. Якщо для рівномірності ви хочете замінити тире (-
) разом з колонами (:
) на підкреслення (_
), ви можете зробити це:
new_name=$(ls | grep $p | tr ':-' '_');
б. Якщо ви хочете, щоб останній підкреслення (безпосередньо перед .txt
) пройшов також, встановіть new_name
змінну як:
new_name=$(ls | grep $p | tr ':-' '_' | sed 's/_\./\./')
mv $old_name $new_name
Примітка: mv
не вдасться, якщо будь-яке з назв файлів в операції з перейменування містить spaces
в ньому. У цьому випадку оберніть відповідні змінні в лапки, як-от: mv "$old_name" $new_name
АБО mv $old_name "$new_name"
АБО mv "$old_name" "$new_name"
1a: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | sed 's/:/_/g'); mv $old_name $new_name
1b: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | tr ':' '_'); mv $old_name $new_name
2: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | tr ':-' '_'); mv $old_name $new_name
3: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | tr ':-' '_' | sed 's/_\./\./'); mv $old_name $new_name
з використанням перейменування :
$ renamer --find ":" --replace "-" *
rename
це інструмент, який встановлено на багатьох дистрибутивах Linux. Але я думаю, для Windows цей інструмент може бути чудовим.
Це може бути зайвим, але ви можете перейменувати будь-які спеціальні символи зі скриптом за посиланням, вказаним у цій відповіді:
for f in
цикл ... - це цикл, який повторює всі файли в поточному каталозі, де вони повинні відповідати*:*
. (Що відбувається з дрирами, які відповідають?). Команда переміщення - це стара назва нового переміщення, де нове ім’я генерується шляхом виконання оболонки з$( subshell here )
. Що робить тр, ...