Linux переименовывает файлы в верхний регистр

17

У меня есть большое количество файлов в формате x00000.jpg , X00000.jpg и xx00000.jpg .

Как я могу переименовать эти файлы, чтобы они были заглавными, игнорируя числовую часть имени?

    
задан Jay 27.11.2013 в 22:39
источник

7 ответов

18
for f in * ; do mv -- "$f" "$(tr [:lower:] [:upper:] <<< "$f")" ; done
    
ответ дан damienfrancois 27.11.2013 в 22:49
источник
10

Вы не можете переименовывать файлы только из Bash, потому что у Bash нет встроенной команды для переименования файлов. Для этого вы должны использовать по крайней мере одну внешнюю команду.

Если Perl разрешен:

perl -e 'for(@ARGV){rename$_,uc}' *.jpg

Если разрешен Python:

python -c 'import os, sys; [os.rename(a, a.upper()) for a in sys.argv[1:]]' *.jpg

Если у вас есть тысячи или несколько файлов, решения, приведенные выше, быстрые, а решения ниже заметно медленнее.

Если AWK, ls и mv разрешены:

# Insecure if the filenames contain an apostrophe or newline!
eval "$(ls -- *.jpg | awk '{print"mv -- \x27"
for file in *; do mv -- "$file" "${file^^}"; done
"\x27 \x27"toupper(%pre%)"\x27"}')"

Если у вас много файлов, приведенные выше решения не работают, потому что *.jpg расширяется до слишком длинного списка аргументов (ошибка: Список аргументов слишком длинный ).

Если tr и mv разрешены, см. ответ damienfrancois.

Если mv разрешено:

%pre%

Обратите внимание, что в конце они переименовывают .jpg в .JPG , но вы можете их изменить, чтобы избежать этого.

    
ответ дан pts 27.11.2013 в 22:48
источник
6

В оболочке bash есть синтаксис для преобразования имени переменной в all-caps.

for file in * ; do      # or *.jpg, or x*.jpg, or whatever
    mv $file ${file^^}
done

Я думаю, что это может быть довольно новая функция, поэтому сначала убедитесь, что ваша версия bash реализует ее. Чтобы избежать ошибок, попробуйте, заменив mv на echo mv , чтобы убедиться, что он будет делать то, что вы хотите.

Документация для этой функции здесь или введите info bash и найдите «верхний».

Вероятно, вы должны решить, что делать, если целевой файл уже существует (скажем, если оба x00000.jpg и X00000.JPG уже существуют), если вы не уверены, что это не проблема. Чтобы обнаружить такие столкновения имен, вы можете попробовать:

ls *.txt | tr '[a-z]' '[A-Z]' | sort | uniq -c | sort -n

и найдите строки, не начинающиеся с 1 .

    
ответ дан Keith Thompson 27.11.2013 в 22:50
источник
4

Объединяя предыдущие ответы, можно получить:

for file in * ; do            # or *.jpg, or x*.jpg, or whatever
   basename=$(tr '[:lower:]' '[:upper:]' <<< "${file%.*}")
   newname="$basename.${file#*.}"
   mv "$file" "$newname"
done
    
ответ дан Wiley 03.11.2014 в 14:10
источник
2

Используя tr:

f='x00000.jpg'
n="${f%.*}'
n=$(tr '[:lower:]' '[:upper:]' <<< "$n")
f="$n.${f#*.}"
echo "$f"

ВЫВОД:

X00000.jpg
    
ответ дан anubhava 27.11.2013 в 22:40
источник
1

rename

Используйте команду rename для переименования нескольких файлов. Я думаю, это самый простой способ. Чтобы перевести строчные имена в верхние, вы должны использовать:

rename 'y/a-z/A-Z/' *

Ссылка

ответ дан Pablo Bianchi 11.08.2017 в 20:38
источник
0

Если вы только переименовываете файлы / директории, вы можете использовать rnm :

rnm -rs '/./\C/g' -fo -dp -1 *

Пояснение:

  1. -rs : заменить строку. /./\C/g заменяет все совпадения . (regex) на верхний регистр.
  2. -fo : режим только файла
  3. -dp : глубина директории (-1 означает неограниченную).

Дополнительные примеры можно найти здесь .

    
ответ дан Jahid 07.05.2016 в 10:33
источник