Добавить расширение файла к файлам с помощью 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...
jm666
источник
Вы можете поместить это в цикл, и эти 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/ *
Алексей
источник
6
find . | while read FILE; do if [ $(file --mime-type -b "$FILE") == "image/jpeg" ]; then mv "$FILE" "$FILE".jpg; fi; done;
Райан Ли
источник
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
rename --dry-run * -a ".jpg" # test  
* -a ".jpg" # rename
Роман Рхрн Нестеров
источник
--dry-runи -aнедоступны в моей версии rename. Если это характерно для какой-либо архитектуры, это следует указать.
Фернандо Сезар
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;
Диллон Бересфорд
источник