Який хороший спосіб додати розширення файлу ".jpg" до файлів без розширень за допомогою bash?
Який хороший спосіб додати розширення файлу ".jpg" до файлів без розширень за допомогою bash?
Відповіді:
for f in *.jpg; do mv "$f" "${f%.jpg}"; done
for f in *; do mv "$f" "$f.jpg"; done
"${f%.jpg}"
- це маніпуляція з рядком оболонки bash. `$ {string% substring}` Видаляє найкоротший збіг $ substring із зворотного боку $ string.
.jpg
навіть до звичайних файлів.
Ви можете використовувати перейменування:
rename 's/(.*)/$1.jpg/' *
rename from to file...
Інший спосіб - без петель
find . -type f -not -name "*.*" -print0 |\
xargs -0 file |\
grep 'JPEG image data' |\
sed 's/:.*//' |\
xargs -I % echo mv % %.jpg
Зламатися:
вищевказана команда призначена для сухого запуску , після неї слід видалити "ехо" перед 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...
Простий, компакт-диск до каталогу, де знаходяться ваші файли, та:
for f in *;do mv $f $f.jpg;done
for f in *;do mv "$f" "$f".jpg;done
для підтримки пробілів в іменах файлів.
У моєму випадку я не знав про тип файлу, тому використовував команду mv за допомогою команди file для перевірки та, можливо, пошуку типу файлу. Це рішення може бути не ідеальним для всіх файлів, оскільки команда file може не розпізнавати тип файлу, але для мене це працювало переважно добре.
for f in *; do ext=$(file $f | awk '{print $2;}'); mv -n "$f" "$f.$ext"; done
Використання awk полягає у видаленні другого слова рядка, повернутого з командного файлу, яке насправді є розширенням.
rename --dry-run * -a ".jpg" # test
* -a ".jpg" # rename
--dry-run
і -a
недоступні в моїй версії rename
. Якщо це характерно для певної архітектури, це слід вказати.
Ви можете використовувати переміщення декількох файлів . Я підтримую цей проект. Синтаксис простий.
mmf files*
Він відкриє ваш $ EDITOR із усіма іменами файлів або vim за замовчуванням, і ви можете просто виділити кінець усіх імен файлів, використовуючи Ctrl + v + G у vim, зберегти файл, вийти і всі його файли перейменовані
Райан Лі
Правильним синтаксисом для додавання розширення файлу до декількох файлів у каталозі, які не мають розширення, є
find . | while read FILE; do if [[ -n `file --mime-type "$FILE" | grep 'message/rfc822'` ]]; then mv "$FILE" "$FILE".eml; fi; done;
mv "${file}" "${file}.jpg"
?