Додайте розширення файлу до файлів за допомогою bash


94

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


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

2
на ваш погляд, що таке "файл без розширень"? Це файл без крапки в назві?
glenn jackman

Відповіді:


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

8
другий ідеально підходить для перейменування файлів без розширень! Дякую!
anon58192932

2
другий додає розширення для всіх файлів, а не лише без розширень
Джефф,

5
так само, як примітка "${f%.jpg}"- це маніпуляція з рядком оболонки bash. `$ {string% substring}` Видаляє найкоротший збіг $ substring із зворотного боку $ string.
Jichao

Попередження: якщо у вас є папка зі змішаними розширеннями, знайте, що вищезазначене додається .jpgнавіть до звичайних файлів.
sachinruk,

61

Ви можете використовувати перейменування:

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

3
яку версію перейменування ви використовуєте? Мій має різні аргументи:rename from to file...
Б Джонсон,

1
перейменування входить до складу perl, тобто версії 5.10.1.
Кім Стебель

3
Це чудово працює з перейменуванням, включеним в Ubuntu (і тому я здогадуюсь про всі дистрибутиви, засновані на Debian), набагато менш детально, ніж відповідь jm666.
Роджер Хіткот,

28

Інший спосіб - без петель

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

Зламатися:

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

вищевказана команда призначена для сухого запуску , після неї слід видалити "ехо" перед mv

EDIT Деякі люди вважають, що тут потрібно "Обернути аргументи шляху в лапки; уникає розділення аргументів на шляхи з пробілами" .

Зазвичай ця рекомендація відповідає дійсності, а в цьому випадку - ні. Оскільки, тут %замінено не розширення оболонки, а 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...

Ви можете ввести це в цикл, і ці ксарги зайві. Мені більше подобається відповідь Раяна в цій ситуації.
Луцій

1
@Lucius - до речі, питання вимагає "безрозширених" файлів - тому Райан повинен знаходити лише ті ...
jm666

@ jm666 привіт! як я можу змінити ваш фрагмент коду, щоб перейменувати всі файли без розширень у папці на відповідні розширення. (Я
виявляю

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для підтримки пробілів в іменах файлів.
Хрітік

Дякую за це елегантне та просте рішення - я неодноразово спирався на цю відповідь, але, схоже, не запам’ятав її. #dejavu
Тім Андерсен

15

сухий пробіг:

 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 автоматично. використовував і працює - велике спасибі! Тільки зараз розширення є CAPS. маленька проблема хоч :)
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.