второй идеально подходит для переименования файлов без расширений! Благодарность!
anon58192932 09
2
второй добавляет расширение ко всем файлам, а не только к файлам без расширений
Джефф
5
так же, как примечание, "${f%.jpg}"это манипуляция строкой оболочки bash. `$ {string% substring}` Удаляет самое короткое совпадение $ substring с конца $ string.
Jichao
Предупреждение: если у вас есть папка со смешанными расширениями, знайте, что это добавляется .jpgдаже к обычным файлам.
какую версию переименования вы используете? У меня разные аргументы:rename from to file...
Б. Джонсон,
1
переименование включено в perl версии 5.10.1.
Ким Стебель
3
Это отлично работает с переименованием, включенным в Ubuntu (и поэтому я предполагаю, что все дистрибутивы на основе Debian), гораздо менее подробный, чем ответ jm666.
приведенная выше команда предназначена для пробного запуска , после нее вы должны удалить "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
Просто перейдите в каталог, в котором находятся ваши файлы, и:
В моем случае я не знал о типе файла, поэтому я использовал команду mv с помощью команды file, чтобы проверить и, возможно, найти тип файла. Это решение может быть не идеальным для всех файлов, поскольку команда file может не распознавать тип файла, но для меня это сработало в основном хорошо.
for f in *; do ext=$(file $f | awk '{print $2;}'); mv -n "$f""$f.$ext"; done
Использование awk состоит в том, чтобы удалить второе слово строки, возвращаемой из командного файла, которая на самом деле является расширением.
Он откроет ваш $ EDITOR со всеми именами файлов или vim по умолчанию, и вы можете просто выделить конец всех имен файлов с помощью Ctrl + v + G в vim, сохранить файл, выйти и все ваши файлы будут переименованы
mv "${file}" "${file}.jpg"
?Ответы:
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
для поддержки пробелов в именах файлов.пробный прогон:
фактическое переименование:
источник
find . | while read FILE; do if [ $(file --mime-type -b "$FILE") == "image/jpeg" ]; then mv "$FILE" "$FILE".jpg; fi; 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
. Если это характерно для какой-либо архитектуры, это следует указать.Вы можете использовать перемещение нескольких файлов . Я сопровождаю этот проект. Синтаксис прост.
Он откроет ваш $ 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;
источник