Добавить расширение файла к файлам с помощью bash


94

Как лучше всего добавить расширение ".jpg" к файлам без расширений с помощью bash?


3
mv "${file}" "${file}.jpg"?
onteria_

2
на ваш взгляд, что такое «файл без расширения»? Это файл без точки в названии?
Гленн Джекман

Ответы:


118
for f in *.jpg; do mv "$f" "${f%.jpg}"; done
for f in *; do mv "$f" "$f.jpg"; done

8
второй идеально подходит для переименования файлов без расширений! Благодарность!
anon58192932 09

2
второй добавляет расширение ко всем файлам, а не только к файлам без расширений
Джефф

5
так же, как примечание, "${f%.jpg}"это манипуляция строкой оболочки bash. `$ {string% substring}` Удаляет самое короткое совпадение $ substring с конца $ string.
Jichao

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

61

Вы можете использовать переименование:

rename 's/(.*)/$1.jpg/' *

3
какую версию переименования вы используете? У меня разные аргументы:rename from to file...
Б. Джонсон,

1
переименование включено в perl версии 5.10.1.
Ким Стебель

3
Это отлично работает с переименованием, включенным в Ubuntu (и поэтому я предполагаю, что все дистрибутивы на основе Debian), гораздо менее подробный, чем ответ jm666.
Roger Heathcote

28

Другой способ - без петель

find . -type f -not -name "*.*" -print0 |\
xargs -0 file |\
grep  'JPEG image data' |\
sed 's/:.*//' |\
xargs -I % echo mv % %.jpg

Сломать:

  • найти все файлы без расширения
  • проверьте тип файла
  • отфильтровать только файлы JPG
  • удалить информацию о типе файла
  • xargs запускает "mv" для каждого файла

приведенная выше команда предназначена для пробного запуска , после нее вы должны удалить "echo" перед mv

РЕДАКТИРОВАТЬ Некоторые люди предполагают, что здесь необходимо «Заключить аргументы пути в кавычки; позволяет избежать разделения аргументов на пути с пробелами» .

Обычно эта рекомендация верна, в данном случае - нет. Потому что здесь %заменяется не расширением оболочки, а xargsвнутренним (напрямую), поэтому %будут заменены правильно даже с пробелами в именах файлов.

Простая демонстрация:

$ mkdir xargstest
$ cd xargstest

# create two files with spaces in names
$ touch 'a b' 'c d'

$ find . -type f -print
./c d
./a b
# notice, here are spaces in the above paths

#the actual xargs mv WITHOUT quotes
$ find . -type f -print | xargs -I % mv % %.ext

$ find . -type f -print
./a b.ext
./c d.ext
# the result is correct even in case with spaces in the filenames...

Вы можете поместить это в цикл, и эти xargs излишни. В этой ситуации мне больше нравится ответ Райана.
Люциус

1
@Lucius - кстати, вопрос: нужны файлы без расширений - так что Райан должен найти только эти ...
jm666

@ jm666 привет! как изменить фрагмент кода, чтобы переименовать все файлы без расширений в папке в их соответствующие расширения. (Я определяю правильные расширения с помощью команды file -b $ filename.)
Soumyajit

24

Просто перейдите в каталог, в котором находятся ваши файлы, и:

for f in *;do mv $f $f.jpg;done

У меня почему-то это работает, а вот решение Сета с кавычками - нет. (OSX Mountain Lion bash)
delrocco

4
Было бы лучше, если бы он использовался for f in *;do mv "$f" "$f".jpg;doneдля поддержки пробелов в именах файлов.
Hritik

Спасибо за это элегантное и простое решение - я неоднократно сталкивался с этим ответом, но не могу его запомнить. #dejavu
Тим Андерсен

16

пробный прогон:

 rename -n s/$/.jpg/ *

фактическое переименование:

 rename s/$/.jpg/ *


1

В моем случае я не знал о типе файла, поэтому я использовал команду mv с помощью команды file, чтобы проверить и, возможно, найти тип файла. Это решение может быть не идеальным для всех файлов, поскольку команда file может не распознавать тип файла, но для меня это сработало в основном хорошо.

for f in *; do ext=$(file $f | awk '{print $2;}'); mv -n "$f" "$f.$ext"; done

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


автоматически обрабатывает jpg и png. использовал и работает - большое спасибо! Только теперь расширения ЗАГЛАВНЫМИ. небольшая проблема :)
krivar


0

Вы можете использовать перемещение нескольких файлов . Я сопровождаю этот проект. Синтаксис прост.

mmf files*

Он откроет ваш $ EDITOR со всеми именами файлов или vim по умолчанию, и вы можете просто выделить конец всех имен файлов с помощью Ctrl + v + G в vim, сохранить файл, выйти и все ваши файлы будут переименованы


-2

Райан Ли

Правильный синтаксис для добавления расширения файла к нескольким файлам в каталоге, которые не имеют расширения файла:

find . | while read FILE; do if [[ -n `file --mime-type "$FILE" | grep 'message/rfc822'` ]]; then  mv "$FILE" "$FILE".eml; fi; done;
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.