У меня есть несколько папок с видеофайлами, которые нужно переименовать во что-то единообразное, например: foldername.videotypexvideonumber.avi
. Я посмотрел на создание сценария оболочки, чтобы сделать это проще. Команда mv
, кажется, лучший способ сделать это.
Тем не менее, каждое руководство / учебник / man-страница, которую я видел, говорит, что когда я переименовываю файл, я должен также включать расширение файла. Это нормально, но в некоторых папках есть видео разных типов файлов, например .mkv и .avi и даже некоторые файлы .rmvb.
Итак, мне нужно знать, есть ли способ переименовать файлы через терминал , при этом не нужно указывать тип файла при этом - в основном, чтобы расширение оставалось неизменным, независимо от того, что это до переименования.
Было бы полезно знать точно , что вы хотите сделать, но вы, безусловно, можете это сделать. Изучение расширения параметров BASH , вероятно, весьма необходимо.
В зависимости от того, что вам делать, может потребоваться разделить расширение и имя файла, а может и нет.
Я предполагаю, что вы уже cd
вошли в папку с соответствующими файлами.
case 1: предположим, что вы хотите изменить строку «bad» на «good» в каждом имени файла; тогда вы можете использовать простую замену, то есть вы можете сделать что-то вроде:
for file in * ; do mv "$file" "${file//bad/good}" ; done
(Убедитесь, что нет никаких изменений, которые заменят плохое на хорошее, перезапишут что-то уже там .) Это будет работать независимо от расширения.
case 2: Предположим, вам нужно добавить «new» перед расширением, чем бы оно ни было, вы можете сделать:
for file in * ; do filename="${file%.*}" ; extension="${file##*.}" ; mv "$file" "${filename}new.${extension}" ; done
Расширение останется таким же, каким бы он ни был.
Я бы дал больше советов, но опять же, я действительно не знаю, что именно вы пытаетесь сделать.
Быстрый ответ:
Вы не можете сделать это, так как расширения являются частью имени файла.
Длинный ответ:
Вы можете использовать графический интерфейс для выполнения расширенных переименований как purrr
или gprename
FULLFILENAME="/home/user/video/myvideo-release.xvid.128kbps.avi"
DIRNAME=$(dirname ${FULLFILENAME}) #-- /home/user/video
BASENAME=$(basename ${FULLFILENAME}) #-- myvideo-release.xvid.128kbps.avi
FILENAME=${BASENAME%.*} #-- myvideo-release.xvid.128kbps
EXTENSION=${BASENAME##*.} #-- avi
[temp] λ = ls
test.doc test.rtf test.txt
[temp] λ = for f in *; do mv "$f" test2`echo "$f" | sed 's/[^.]*//'`; done
[temp] λ = ls
test2.doc test2.rtf test2.txt
Возможно, есть более элегантный способ сделать это, но он работает
Замените test2 на что угодно, если вам нужен счетчик или что-то в этом роде.