Ответы:
Простой 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, но вот моя быстрая и грязная версия с ruby.
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'
Бонус очистки :
а. Если для единообразия вы хотите заменить дефисы (-) вместе с двоеточиями (:) на подчеркивание (_), вы можете сделать это:
new_name=$(ls | grep $p | tr ':-' '_');
б. Если вы хотите, чтобы последний знак подчеркивания (непосредственно перед .txt) также исчез, установите new_nameпеременную как:
new_name=$(ls | grep $p | tr ':-' '_' | sed 's/_\./\./')
mv $old_name $new_name
NB: 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 :
$ renamer --find ":" --replace "-" *
renameэто инструмент, который предустановлен во многих дистрибутивах Linux. Но я думаю, что для Windows этот инструмент может быть отличным.
Это может быть излишним, но вы можете переименовать любые специальные символы с помощью скрипта по ссылке, приведенной в этом ответе:
for f inцикл ... - это цикл, который перебирает все файлы в текущем каталоге, где файлы должны совпадать*:*. (Что происходит с папками, которые совпадают?). Команда перемещения - это перемещение старого имени на новое имя, в котором новое имя создается путем выполнения оболочки с помощью$( subshell here ). Что тр, делает ...