У меня есть несколько каталогов и подкаталогов, содержащих файлы без расширения. Я хочу добавить .jpg
ко всем файлам, содержащимся в этих каталогах. Я видел сценарии bash для изменения расширения файла, но не просто для его добавления. Он также должен быть рекурсивным, может кто-нибудь помочь?
рекурсивно добавить расширение файла ко всем файлам
Ответы (6)
Альтернативная команда без явного цикла (man find
):
find . -type f -exec mv '{}' '{}'.jpg \;
Объяснение: это рекурсивно находит все файлы (-type f
), начиная с текущего каталога (.
), и применяет команду перемещения ( mv
) каждому из них. Обратите внимание на кавычки вокруг {}
, чтобы имена файлов с пробелами (и даже новые строки ...) обрабатывались правильно.
for
, нарушающий bash, чтобы перебирать список файлов, это неверно. Цикл bash for
итеративно выдает каждую mv
команду.
- person nik; 10.07.2009
find
сначала список файлов перед выполнением оператора -exec
? Думаю, да, но хочу прояснить этот момент перед написанием бесконечных циклов.
- person Boldewyn; 10.07.2009
-P
), если вы подозреваете возможный цикл.
- person nik; 10.07.2009
-not -name "*.*"
поможет.
- person Stephan202; 10.07.2009
.sample
версий файлов конфигурации :)
- person scones; 26.07.2016
это найдет файлы без расширения и добавит ваш .jpg
find /path -type f -not -name "*.*" -exec mv "{}" "{}".jpg \;
Это немного поздно, но я подумал, что добавлю лучшее решение (хотя, возможно, менее читаемое), чем те, которые были до сих пор:
find /path -type f -not -name "*.*" -print0 | xargs -0 rename 's/(.)$/$1.jpg/'
Использование шаблона find | xargs
обычно приводит к более эффективному выполнению, поскольку вам не нужно создавать новый процесс для каждого файла.
Обратите внимание, что для этого требуется версия переименования, которая есть в дистрибутивах со вкусом Debian (также известная как prename), а не традиционное переименование. Однако это всего лишь крошечный сценарий Perl, поэтому было бы достаточно легко использовать приведенную выше команду в любой системе.
нравится,
for f in $(find . -type f); do mv $f ${f}.jpg; done
Я не ожидаю, что у вас будут имена файлов, разделенные пробелами,
Если вы это сделаете, имена нужно будет немного обработать.
Если вы хотите выполнить команду из другого каталога,
вы можете заменить find .
на find /target/directory
.
-type
.
- person Stephan202; 10.07.2009
Для переименования всех файлов без расширения в Windows basic вы можете сделать ren * *.jpg
Поскольку файл не имеет расширения, просто используйте *, или, если вы хотите изменить png на jpg, используйте ren *.png *.jpg
rename
не уверен, что он может переименовывать файлы без расширений (сейчас я на windows 7)
rename
, одна - программа на языке C, включенная в util-linux-ng, а другая - программа Perl (написанная самим Уоллом) на машинах Debian нашего университета. На самом деле ни один из них не выполняет рекурсию.
- person Boldewyn; 10.07.2009