Как лучше всего добавить расширение ".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
Сломать:
приведенная выше команда предназначена для пробного запуска , после нее вы должны удалить "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...
Просто перейдите в каталог, в котором находятся ваши файлы, и:
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"
?