Відповіді:
Простий 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 ). Що робить тр, ...