У меня есть большое количество файлов в формате x00000.jpg
, x00000.jpg
и xx00000.jpg
.
Как я могу переименовать эти файлы, чтобы они были заглавными, игнорируя числовую часть имени?
У меня есть большое количество файлов в формате x00000.jpg
, x00000.jpg
и xx00000.jpg
.
Как я могу переименовать эти файлы, чтобы они были заглавными, игнорируя числовую часть имени?
for f in * ; do mv -- "$f" "$(tr [:lower:] [:upper:] <<< "$f")" ; done
Вы не можете переименовывать файлы только из 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
в конце, но вы можете изменить их, чтобы этого не было.
Оболочка 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
.
Объединяя предыдущие ответы, можно получить:
for file in * ; do # or *.jpg, or x*.jpg, or whatever
basename=$(tr '[:lower:]' '[:upper:]' <<< "${file%.*}")
newname="$basename.${file#*.}"
mv "$file" "$newname"
done
Используя tr:
f='x00000.jpg'
n="${f%.*}'
n=$(tr '[:lower:]' '[:upper:]' <<< "$n")
f="$n.${f#*.}"
echo "$f"
ВЫВОД:
X00000.jpg
rename
Используйте команду rename
для переименования нескольких файлов. Я думаю, это самый простой способ. Чтобы перевести строчные имена в верхние, вы должны использовать:
rename 'y/a-z/A-Z/' *
Если вы только переименовываете файлы /dirs, вы можете использовать rnm:
rnm -rs '/./\C/g' -fo -dp -1 *
Пояснение:
-rs
: заменить строку. /./\C/g
заменяет все соответствия .
(regex) на верхний регистр.-fo
: режим только файла-dp
: глубина директории (-1 означает неограниченную).Дополнительные примеры можно найти здесь.