Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

for f in * ; do mv -- "$f" "$(tr [:lower:] [:upper:] <<< "$f")" ; done

Ответ 2

Вы не можете переименовывать файлы только из 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"$0"\x27 \x27"toupper($0)"\x27"}')"

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

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

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

for file in *; do mv -- "$file" "${file^^}"; done

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

Ответ 3

Оболочка 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.

Ответ 4

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

for file in * ; do            # or *.jpg, or x*.jpg, or whatever
   basename=$(tr '[:lower:]' '[:upper:]' <<< "${file%.*}")
   newname="$basename.${file#*.}"
   mv "$file" "$newname"
done

Ответ 5

Используя tr:

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

ВЫВОД:

X00000.jpg

Ответ 6

rename

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

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

Ссылка

Ответ 7

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

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

Пояснение:

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

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