переименуйте имена файлов от нижнего регистра до верхнего регистра

Я имею о 2k файла, которые в настоящее время находятся в нижнем регистре как:

file_one.cfr
file_two.cfr
....

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

FILE_ONE.cfr
FILE_TWO.cfr
....

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

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

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

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

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

3
задан 11.04.2010, 16:50

5 ответов

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

2
ответ дан 07.12.2019, 22:56

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

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

Это основано на Вашем предлагаемом решении, но использует расширение параметра ${parameter%word} разделять расширение от имени файла.

4
ответ дан 07.12.2019, 22:56

если у Вас есть удар 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
2
ответ дан 07.12.2019, 22:56

У Вас может уже быть сценарий Perl в Вашей названной системе rename или prename.

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

Или вот версия сценария Vlad, который избавляет от необходимости 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
3
ответ дан 07.12.2019, 22:56
#!/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
1
ответ дан 07.12.2019, 22:56

Теги

Похожие вопросы