3

У меня есть около 2 КБ файла, которые в настоящее время в нижнем регистре, как:

file_one.cfr
file_two.cfr
....

Я ищу быстрый способ переименовать их в верхний регистр, чтобы они были похожи;

FILE_ONE.cfr
FILE_TWO.cfr
....

Если я использую из моей оболочки;

for i in *; do mv $i `echo $i | tr [:lower:] [:upper:]`; done

Я могу получить все файлы и расширения файлов в верхнем регистре.

Но расширение должно оставаться в нижнем регистре, поэтому мой подход не работает.

Любой язык программирования приветствуется.

5 ответов5

4

В любой оболочке:

for i in *.cfr 
do 
    mv "$i" "$(echo ${i%.cfr} | tr [:lower:] [:upper:]).cfr"; 
done

Он основан на предложенном вами решении, но использует расширение параметра ${parameter%word} чтобы удалить расширение из имени файла.

3

Возможно, у вас уже есть Perl-скрипт в вашей системе, называемый rename или prename .

rename 's/([^.]*)/\U$1/' *.cfr

Или вот версия скрипта Влада, которая устраняет необходимость в grep и sed (он будет работать в версиях Bash ранее, чем версия 4, так как он использует tr вместо оператора ^^ ):

#!/bin/bash

for f in *.cfr
do
    if [[ "$f" == "${f//.}" ]]; then continue; fi
    name="${f%.*}"
    ext="${f##*.}"
    newfullname="$(<<< "$name" tr [:lower:] [:upper:])$ext"
    [[ "$f" == "$newfullname" ]] || mv "$f" "$newfullname"
done
2

Вы всегда можете использовать бесплатную утилиту Bulk Rename.

2
#!/bin/bash

for f in *
do
    <<< $f grep -q "\." || continue
    name=$(<<<$f sed 's/\.[^\.]*$//')
    ext=$(<<< $f sed 's/^.*\(\.[^\.]*\)$/\1/')
    newfullname=$(<<< $name tr [:lower:] [:upper:])$ext
    [ "$f" == "$newfullname" ] || mv "$f" "$newfullname"
done
2

если у вас bash 4.0

#!/bin/bash

for file in file_*cfr
do
  front=${file%.cfr}
  newfile=${front^^}.cfr
  echo mv "$file" "$newfile"
done

или вы можете использовать просто awk

awk '
{
  f=FILENAME
  gsub(/\.cfr$/,"",f)
  newfile=toupper(f)".cfr"
  cmd="mv \047"FILENAME"\047 \047"newfile"\047"
  # system(cmd) #uncomment to use
}
' file_*cfr

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .