Как вы переименовываете файлы, игнорируя расширение файла в терминале?

У меня есть несколько папок с видеофайлами, которые нужно переименовать во что-то единообразное, например: foldername.videotypexvideonumber.avi. Я посмотрел на создание сценария оболочки, чтобы сделать это проще. Команда mv, кажется, лучший способ сделать это.

Тем не менее, каждое руководство / учебник / man-страница, которую я видел, говорит, что когда я переименовываю файл, я должен также включать расширение файла. Это нормально, но в некоторых папках есть видео разных типов файлов, например .mkv и .avi и даже некоторые файлы .rmvb.

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

2
задан 22 January 2011 в 17:56

3 ответа

Было бы полезно знать точно , что вы хотите сделать, но вы, безусловно, можете это сделать. Изучение расширения параметров 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

Расширение останется таким же, каким бы он ни был.

Я бы дал больше советов, но опять же, я действительно не знаю, что именно вы пытаетесь сделать.

0
ответ дан 22 January 2011 в 17:56

Быстрый ответ:

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

Длинный ответ:

Вы можете использовать графический интерфейс для выполнения расширенных переименований как 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

0
ответ дан 22 January 2011 в 17:56
[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 на что угодно, если вам нужен счетчик или что-то в этом роде.

0
ответ дан 22 January 2011 в 17:56

Другие вопросы по тегам:

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