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

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

, каждое руководство/учебник/страницу я видел, говорит, что когда я переименовать файл я должен также включать расширение файла. Обычно это нормально, но некоторые папки имеют видео файлов различных типов, например .MKV и .AVI и даже некоторые .файлов RMVB.

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

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

24 ответа

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

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

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

Вы можете использовать графический интерфейс для выполнения расширенных переименований как purrr или gprename

BUT!

В вашем сценарии переименования пакетов вы можете использовать следующие методы разделения имен файлов: [ ! d7]

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
1
ответ дан 25 May 2018 в 23:20
  • 1
    Я не понимаю, что сказано в начале. Очевидно, все, что вы можете сделать в скрипте, который вы можете сделать в оболочке ... – frabjous 22 January 2011 в 19:21
  • 2
    Хороший, спасибо большое. Это должно облегчить мою жизнь. – Saladin Akara 22 January 2011 в 19:28
  • 3
    Кроме того, вам, вероятно, нужны такие вещи, как FILENAME="${BASENAME%.*}" с кавычками, если в именах файлов есть пробелы. – frabjous 22 January 2011 в 19:29
  • 4
    Я немного отредактировал, чтобы прояснить суть. – ulidtko 22 January 2011 в 19:30
  • 5
    Почему вы используете basename и dirname, когда уже знаете, как использовать расширение параметра? Кроме того, вы не указали аргументы в basename и dirname, поэтому, если кто-то попробует ваше решение, у них появятся проблемы с именами файлов, содержащими специальные символы. И, наконец, соглашение заключается в использовании имен переменных нижнего регистра для всех, кроме переменных среды. См. mywiki.wooledge.org/Arguments – geirha 2 February 2011 в 12:54

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

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

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

Вы можете использовать графический интерфейс для выполнения расширенных переименований как purrr или gprename

BUT!

В вашем сценарии переименования пакетов вы можете использовать следующие методы разделения имен файлов: [ ! d7] 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

1
ответ дан 25 July 2018 в 22:35

ответ:

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

ответ:

Вы можете использовать графический интерфейс дополнительно переименовывает как [F2] или 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
1
ответ дан 2 August 2018 в 04:01

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

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

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

Вы можете использовать графический интерфейс для делать расширенные переименования как purrr или gprename

BUT!

В вашем скрипте переименования пакетов вы можете использовать следующие методы имени файла

 
  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  
1
ответ дан 4 August 2018 в 20:04

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

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

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

Вы можете использовать графический интерфейс для делать расширенные переименования как purrr или gprename

BUT!

В вашем скрипте переименования пакетов вы можете использовать следующие методы имени файла

 
  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  
1
ответ дан 6 August 2018 в 04:05

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

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

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

Вы можете использовать графический интерфейс для делать расширенные переименования как purrr или gprename

BUT!

В вашем скрипте переименования пакетов вы можете использовать следующие методы имени файла

 
  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  
1
ответ дан 7 August 2018 в 22:05

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

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

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

Вы можете использовать графический интерфейс для делать расширенные переименования как purrr или gprename

BUT!

В вашем скрипте переименования пакетов вы можете использовать следующие методы имени файла

 
  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  
1
ответ дан 10 August 2018 в 10:19

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

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

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

Вы можете использовать графический интерфейс для делать расширенные переименования как purrr или gprename

BUT!

В вашем скрипте переименования пакетов вы можете использовать следующие методы имени файла

 
  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  
1
ответ дан 13 August 2018 в 16:43
  • 1
    Я не понимаю, что сказано в начале. Очевидно, все, что вы можете сделать в скрипте, который вы можете сделать в оболочке ... – frabjous 22 January 2011 в 19:21
  • 2
    Хороший, спасибо большое. Это должно облегчить мою жизнь. – Saladin Akara 22 January 2011 в 19:28
  • 3
    Кроме того, вам, вероятно, нужны такие вещи, как FILENAME = & quot; $ {BASENAME%. *} & Quot; с кавычками, если имена файлов имеют в них пробелы. – frabjous 22 January 2011 в 19:29
  • 4
    Я немного отредактировал, чтобы прояснить суть. – ulidtko 22 January 2011 в 19:30
  • 5
    Почему вы используете basename и dirname , когда знаете, как использовать расширение параметра? Кроме того, вам не удалось привести аргументы в basename и dirname , поэтому, если кто-то попробует ваше решение, у них появятся проблемы с именами файлов, содержащими специальные символы. И, наконец, соглашение заключается в использовании имен переменных нижнего регистра для всех, кроме переменных среды. См. [D0] mywiki.wooledge.org/Arguments – geirha 2 February 2011 в 12:54

Это поможет точно узнать, что вы хотите сделать, но вы можете это сделать. Изучение расширения параметра BASH, вероятно, довольно необходимо.

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

Я предположим, что вы уже cd вышли в папку с файлами, о которых идет речь.

case 1: предположим, что вы хотите изменить строку «bad» на «good» в каждом имени файла; то вы можете использовать простую подстановку, т. е. вы можете сделать что-то вроде:

for file in * ; do mv "$file" "${file//bad/good}" ; done

(Удостоверьтесь, что нет никаких изменений, которые изменяют плохое, чтобы хорошо перезаписывать что-то уже есть.) Это будет работать независимо от расширения.

case 1: Suppse вам нужно добавить «новое» перед расширением, что бы это ни было, тогда вы можете сделать:

for file in * ; do filename="${file%.*}" ; extension="${file##*.}" ; mv "$file" "${filename}new.${extension}" ; done

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

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

1
ответ дан 25 May 2018 в 23:20
  • 1
    В терминах точно , что я хочу сделать: я хочу переименовать файлы из (например) [DB]_2437968_Bleach_298.avi в Bleach.09x12.avi - это не проблема, если каждый файл имел такое же расширение. Я хочу изменить имя файла только перед расширением. – Saladin Akara 22 January 2011 в 20:20
  • 2
    Откуда появляется 09x12, и как вы определяете, какую часть старого имени файла использовать, например? как вы могли бы использовать Bleach в этом случае? – geirha 22 January 2011 в 21:29
  • 3
    В самом деле; вы можете это сделать, но нам нужно знать точные правила, как преобразовать имя. – frabjous 22 January 2011 в 22:03
[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
ответ дан 25 May 2018 в 23:20

это поможет точно знать, что вы хотите сделать, но вы, конечно, можете сделать это. Узнав о bash расширения параметр, вероятно, довольно надо.

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

я собираюсь предполагаю, что вы уже cdЭд в папку с файлами в вопрос.

случай 1: предположим, что вы хотите изменить строку "плохо" до "хорошо" в каждом имени файла; затем вы можете использовать простой подстановки, т. е. вы можете сделать что-то вроде:

for file in * ; do mv "$file" "${file//bad/good}" ; done

(убедитесь, что нет никаких изменений, что изменение к лучшему будет перезаписать что-то уже есть.) Это сработает независимо от расширения.

вариант 1: Suppse вам нужно добавить "новый" перед расширением, что бы это ни было, то можно сделать так:

for file in * ; do filename="${file%.*}" ; extension="${file##*.}" ; mv "$file" "${filename}new.${extension}" ; done

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

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

1
ответ дан 25 July 2018 в 22:35
  • 1
    С точки зрения в точности, что я хочу сделать: я хочу пакетное переименование файлов с (например) [F1], чтобы Bleach.09x12.avi - это не проблема, если каждый файл имел такое же расширение. Я хочу изменить имя файла только перед расширением. – Saladin Akara 22 January 2011 в 20:20
  • 2
    Причем тут 09x12 и как вы определяете, что часть старого имени файла, чтобы использовать, например, как вы знаете, чтобы использовать Bleach в этом случае? – geirha 22 January 2011 в 21:29
  • 3
    В самом деле; вы можете это сделать, но нам нужно знать точные правила, как преобразовать имя. – frabjous 22 January 2011 в 22:03
[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
ответ дан 25 July 2018 в 22:35

это поможет точно знать, что вы хотите сделать, но вы, конечно, можете сделать это. Узнав о bash расширения параметр, вероятно, довольно надо.

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

я собираюсь предполагаю, что вы уже cdЭд в папку с файлами в вопрос.

случай 1: предположим, что вы хотите изменить строку "плохо" до "хорошо" в каждом имени файла; затем вы можете использовать простой подстановки, т. е. вы можете сделать что-то вроде:

for file in * ; do mv "$file" "${file//bad/good}" ; done

(убедитесь, что нет никаких изменений, что изменение к лучшему будет перезаписать что-то уже есть.) Это сработает независимо от расширения.

вариант 1: Suppse вам нужно добавить "новый" перед расширением, что бы это ни было, то можно сделать так:

for file in * ; do filename="${file%.*}" ; extension="${file##*.}" ; mv "$file" "${filename}new.${extension}" ; done

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

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

1
ответ дан 2 August 2018 в 04:01
  • 1
    С точки зрения в точности, что я хочу сделать: я хочу пакетное переименование файлов с (например) [F1], чтобы Bleach.09x12.avi - это не проблема, если каждый файл имел такое же расширение. Я хочу изменить имя файла только перед расширением. – Saladin Akara 22 January 2011 в 20:20
  • 2
    Причем тут 09x12 и как вы определяете, что часть старого имени файла, чтобы использовать, например, как вы знаете, чтобы использовать Bleach в этом случае? – geirha 22 January 2011 в 21:29
  • 3
    Действительно, вы, безусловно, можете сделать это, но нам нужно знать точные правила о том, как преобразовать имя. – frabjous 22 January 2011 в 22:03
[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
ответ дан 2 August 2018 в 04:01
  [temp] λ = ls test.doc test.rtf test.txt [temp] λ = для f in *;  do mv "$ f" test2`echo "$ f" |  sed 's /[^.]*//' `;  done [temp] λ = ls test2.doc test2.rtf test2.txt  

Возможно, существует более элегантный способ сделать это, но он работает

Замените test2 на все, что вам нужно, счетчик или что-то в этом роде.

0
ответ дан 4 August 2018 в 20:04

Это поможет узнать точно , что вы хотите сделать, но вы, безусловно, можете это сделать. Изучение Расширение параметра BASH , вероятно, очень необходимо.

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

Я предполагаю, что вы уже cd ed в папку с файлами, о которых идет речь.

case 1: предположим, что вы хотите изменить строку «плохо» на «хорошо» в каждом имени файла; то вы можете использовать простую подстановку, т. е. вы можете сделать что-то вроде:

для файла в *; make mv "$ file" "$ {file // bad / good}"; done

(Удостоверьтесь, что нет изменений, которые изменяют плохое на хорошее, перезапишут что-то уже там.) Это будет работать независимо от расширения.

case 2 : Suppse вам нужно добавить «новое» перед расширением, что бы это ни было, тогда вы можете сделать:

для файла в *; do filename = "$ {file%. *}"; extension = "$ {file ## *.}"; mv "$ file" "$ {filename} new. $ {extension}";

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

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

1
ответ дан 4 August 2018 в 20:04
  [temp] λ = ls test.doc test.rtf test.txt [temp] λ = для f in *;  do mv "$ f" test2`echo "$ f" |  sed 's /[^.]*//' `;  done [temp] λ = ls test2.doc test2.rtf test2.txt  

Возможно, существует более элегантный способ сделать это, но он работает

Замените test2 на все, что вам нужно, счетчик или что-то в этом роде.

0
ответ дан 6 August 2018 в 04:05

Это поможет узнать точно , что вы хотите сделать, но вы, безусловно, можете это сделать. Изучение Расширение параметра BASH , вероятно, очень необходимо.

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

Я предполагаю, что вы уже cd ed в папку с файлами, о которых идет речь.

case 1: предположим, что вы хотите изменить строку «плохо» на «хорошо» в каждом имени файла; то вы можете использовать простую подстановку, т. е. вы можете сделать что-то вроде:

для файла в *; make mv "$ file" "$ {file // bad / good}"; done

(Удостоверьтесь, что нет изменений, которые изменяют плохое на хорошее, перезапишут что-то уже там.) Это будет работать независимо от расширения.

case 2 : Suppse вам нужно добавить «новое» перед расширением, что бы это ни было, тогда вы можете сделать:

для файла в *; do filename = "$ {file%. *}"; extension = "$ {file ## *.}"; mv "$ file" "$ {filename} new. $ {extension}";

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

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

1
ответ дан 6 August 2018 в 04:05
  [temp] λ = ls test.doc test.rtf test.txt [temp] λ = для f in *;  do mv "$ f" test2`echo "$ f" |  sed 's /[^.]*//' `;  done [temp] λ = ls test2.doc test2.rtf test2.txt  

Возможно, существует более элегантный способ сделать это, но он работает

Замените test2 на все, что вам нужно, счетчик или что-то в этом роде.

0
ответ дан 7 August 2018 в 22:05

Это поможет узнать точно , что вы хотите сделать, но вы, безусловно, можете это сделать. Изучение Расширение параметра BASH , вероятно, очень необходимо.

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

Я предполагаю, что вы уже cd ed в папку с файлами, о которых идет речь.

case 1: предположим, что вы хотите изменить строку «плохо» на «хорошо» в каждом имени файла; то вы можете использовать простую подстановку, т. е. вы можете сделать что-то вроде:

для файла в *; make mv "$ file" "$ {file // bad / good}"; done

(Удостоверьтесь, что нет изменений, которые изменяют плохое на хорошее, перезапишут что-то уже там.) Это будет работать независимо от расширения.

case 2 : Suppse вам нужно добавить «новое» перед расширением, что бы это ни было, тогда вы можете сделать:

для файла в *; do filename = "$ {file%. *}"; extension = "$ {file ## *.}"; mv "$ file" "$ {filename} new. $ {extension}";

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

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

1
ответ дан 7 August 2018 в 22:05
  [temp] λ = ls test.doc test.rtf test.txt [temp] λ = для f in *;  do mv "$ f" test2`echo "$ f" |  sed 's /[^.]*//' `;  done [temp] λ = ls test2.doc test2.rtf test2.txt  

Возможно, существует более элегантный способ сделать это, но он работает

Замените test2 на все, что вам нужно, счетчик или что-то в этом роде.

0
ответ дан 10 August 2018 в 10:19

Это поможет узнать точно , что вы хотите сделать, но вы, безусловно, можете это сделать. Изучение Расширение параметра BASH , вероятно, очень необходимо.

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

Я предполагаю, что вы уже cd ed в папку с файлами, о которых идет речь.

case 1: предположим, что вы хотите изменить строку «плохо» на «хорошо» в каждом имени файла; то вы можете использовать простую подстановку, т. е. вы можете сделать что-то вроде:

для файла в *; make mv "$ file" "$ {file // bad / good}"; done

(Удостоверьтесь, что нет изменений, которые изменяют плохое на хорошее, перезапишут что-то уже там.) Это будет работать независимо от расширения.

case 2 : Suppse вам нужно добавить «новое» перед расширением, что бы это ни было, тогда вы можете сделать:

для файла в *; do filename = "$ {file%. *}"; extension = "$ {file ## *.}"; mv "$ file" "$ {filename} new. $ {extension}";

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

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

1
ответ дан 10 August 2018 в 10:19
  [temp] λ = ls test.doc test.rtf test.txt [temp] λ = для f in *;  do mv "$ f" test2`echo "$ f" |  sed 's /[^.]*//' `;  done [temp] λ = ls test2.doc test2.rtf test2.txt  

Возможно, существует более элегантный способ сделать это, но он работает

Замените test2 на все, что вам нужно, счетчик или что-то в этом роде.

0
ответ дан 13 August 2018 в 16:43

Это поможет узнать точно , что вы хотите сделать, но вы, безусловно, можете это сделать. Изучение Расширение параметра BASH , вероятно, очень необходимо.

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

Я предполагаю, что вы уже cd ed в папку с файлами, о которых идет речь.

case 1: предположим, что вы хотите изменить строку «плохо» на «хорошо» в каждом имени файла; то вы можете использовать простую подстановку, т. е. вы можете сделать что-то вроде:

для файла в *; make mv "$ file" "$ {file // bad / good}"; done

(Удостоверьтесь, что нет изменений, которые изменяют плохое на хорошее, перезапишут что-то уже там.) Это будет работать независимо от расширения.

case 2 : Suppse вам нужно добавить «новое» перед расширением, что бы это ни было, тогда вы можете сделать:

для файла в *; do filename = "$ {file%. *}"; extension = "$ {file ## *.}"; mv "$ file" "$ {filename} new. $ {extension}";

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

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

1
ответ дан 13 August 2018 в 16:43
  • 1
    В терминах точно , что я хочу сделать: я хочу переименовать файлы из (например) [DB] _2437968_Bleach_298.avi в Bleach.09x12.avi - это не проблема, если каждый файл имеет такое же расширение. Я хочу изменить имя файла только перед расширением. – Saladin Akara 22 January 2011 в 20:20
  • 2
    Откуда возникает 09x12 , и как вы определяете, какую часть старого имени файла использовать, например? как вы могли бы использовать Bleach в этом случае? – geirha 22 January 2011 в 21:29
  • 3
    В самом деле; вы можете это сделать, но нам нужно знать точные правила, как преобразовать имя. – frabjous 22 January 2011 в 22:03

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

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