пакетное переименование файлов

<p>у меня есть каталог, полный изображений:</p><pre><code>image0001.png image0002.png image0003.png ... </code></pre><p>и я бы хотел, чтобы их переименовали (скажем).</p><pre><code>0001.png 0002.png 0003.png ... </code></pre><p>как мне это сделать?</p>

<p>если вы используете bash или другую posix-совместимую оболочку:</p><pre><code>for f in *.png; do mv -- "$f" "${f#image}" done </code></pre>

<p>в debian и его производных perl <code>rename</code> работает аналогично <code>sed</code> следующим образом:</p><pre><code> rename -v 's/image//' *.png </code></pre><p>также есть <code>rename</code> from <code>util-linux</code>, который работает следующим образом:</p><pre><code> rename image '' *.png </code></pre>

<h1>zmv</h1><p>в оболочке zsh имеется мощная команда пакетного переименования, называемая <code>zmv</code>.</p><p>сначала вам нужно включить команду <code>zmv</code> следующим образом (это может войти в ваш <code>~/.zshrc</code>).</p><pre><code>autoload zmv </code></pre><p>основной синтаксис: <code>zmv pattern replacement</code>. шаблон представляет собой выражение глобуса shell. части шаблона могут быть заключены в круглые скобки. текст замены может содержать <code>$1, $2</code> и т. д. для обозначения n-й группы в скобках в шаблоне. например:</p><pre><code>zmv 'image(*.png)' '$1' вы также можете попросить zsh автоматически определить $1</code>, <code>$2 и т. д., чтобы соответствовать символам подстановки в шаблоне:zmv -w 'image.png' '$1.png' </code></pre>

<p>обычно я использую полезную и простую <strong> mmv </strong> ( <a href="http://manpages.ubuntu.com/manpages/precise/man1/mmv.1.html">man page</a> ) утилиту для этого варианта использования:</p><pre><code>$ mmv "image.png" "#1.png" выполню вашу задачу.#1 в целевом шаблоне будет заменено на то, что соответствует шаблону в исходном шаблоне. это также работает для нескольких подстановочных знаков и может использоваться, например, для изменения порядка частей имен файлов. вы также можете легко делать более сложные вещи, такие как преобразование строчных букв в прописные.не забудьте защитить шаблоны от оболочки, цитируя.

posix ш для петлииспользует sed для переименованияfor i in imagejpg do mv -v "$i" "$(echo "$i" | sed -e 's/^\.\/image//' - )" done </code></pre>

<p>perl мне нравится так:</p><pre><code>perl -nle '$old=$\_; s/image//; qx(mv $old $\_)' </code></pre><p>вы также можете использовать тот же шаблон для других задач, таких как копирование файлов в другой каталог:</p><pre><code>perl -nle '$old=$\_; s(image)(/path/to/new/dir/); qx(mv $old $\_)' </code></pre>

<h1>qmv</h1><p>команда <code>qmv</code> from <code>renameutils</code> открывает редактор, показывающий список имен файлов с двумя столбцами, разделенными вкладкой. в каждой строке показано одно из имен файлов, одинаковое в обоих столбцах. правый столбец представляет новые имена файлов.<br> чтобы внести изменения, отредактируйте имена справа. в этом примере <code>:%s/...</code> или режим визуального блока полезны.</p><h2>имена файлов в вашем редакторе</h2><pre><code>$ qmv .png в редакторе:image0001.png image0001.png image0002.png image0002.png image0003.png image0003.png ~ ~ ~ ~ "/tmp/user/1000/qmvxwyvms" 3l, 93c редактировать имена в правом столбце: (удаление префикса image из всех строк в режиме визуального блока)image0001.png 0001.png image0002.png 0002.png image0003.png 0003.png ~ ~ ~ ~ :wq журнал переименования:image0001.png -> 0001.png image0002.png -> 0002.png image0003.png -> 0003.png (например, ubuntu: apt-get install renameutils)

рекурсивныйлегко рекурсивно выбирая файлы изображений  png и предполагает, что нет необходимости иметь дело с переводом строки в именах файловfind . -name "image.png" | while read f; do mv -v "$f" "$(echo "$f" | sed -e 's/^\.\/image//' - )"; done </code></pre><p><em>безопасно, может работать с пробелами, новыми строками, обратными слешами и всем остальным</em>:</p><pre><code>find . -name "image*.png" | while ifs= read -r f; do mv -v "$f" "$(echo "$f" | sed -e 's/^./image//' - )"; done 

использование <a href="http://www.gnu.org/software/bash/manual/bashref.html#brace-expansion">расширение скобки оболочки :for n in {0001..1000}; do mv "{image,}$n.png"; done </code></pre>

<p>попробуйте brename ( <a href="https://github.com/shenwei356/brename">https://github.com/shenwei356/brename</a> ), практичный кроссплатформенный инструмент командной строки для безопасного пакетного переименования файлов/каталогов с помощью регулярных выражений (с поддержкой windows, linux и os x ).</p><p> <a href="https://twitter.com/patrickdurusau">@ patrickdurusa</a> сказал:</p><blockquote> <p>в linux есть множество вариантов переименования пакетных файлов, но я не вижу каких-либо недостатков в brename, которые бросались бы на меня.</p> </blockquote><p>особенности:</p><ul> <li><strong> кросс-платформенная </strong>. поддержка windows, mac os x и linux.</li> <li><strong> safe </strong>. by <strong> <em> проверка потенциальных конфликтов и ошибок</em> </strong>.</li> <li><strong> фильтрация файлов </strong>. поддержка включения и исключения файлов с помощью регулярного выражения. нет необходимости запускать такие команды, как <code>find ./ -name "*.html" -exec cmd</code>.</li> <li><strong> переименование субматча с соответствующим значением через файл значения ключа </strong>.</li> <li><strong> переименование с помощью возрастающего целого числа </strong>.</li> <li><strong> рекурсивное переименование файлов и каталогов </strong>.</li> <li><strong> поддержка пробного запуска </strong>.</li> <li><strong> красочный вывод </strong>.</li> </ul><p>команда:</p><pre><code>$ brename -f .png -p image [info] checking: [ ok ] 'image0001.png' -> '0001.png' [info] checking: [ ok ] 'image0002.png' -> '0002.png' [info] checking: [ ok ] 'image0003.png' -> '0003.png' [info] 3 path(s) to be renamed [info] renamed: 'image0001.png' -> '0001.png' [info] renamed: 'image0002.png' -> '0002.png' [info] renamed: 'image0003.png' -> '0003.png' [info] 3 path(s) renamed 

posix sh используя цикл whileчтение имен из команды find.find . -maxdepth 1 -type f -name 'imagepng' | while ifs= read -r f; do mv -v "$f" "$(echo "$f" | sed -e 's/^\.\/image//' - )" done </code></pre><p><em>чтение имен из файла</em></p><pre><code>while ifs= read -r f; do mv -v "$f" "$(echo "$f"|sed -e 's/^./image//' - )"; done < flist 

для <strong> windows и linux </strong> это <a href="https://github.com/circulosmeos/rnm">скрипт perl подойдет; в этом случае:$ rnm -l 's/^image//' '*.png' </code></pre><p>сценарий может <strong> рекурсивно запускаться в каталогах </strong> и даже добавлять счет ко всем из них:</p><pre><code>$ rnm -r 's/^/$counter./' '/\.png$/' </code></pre><p>символы utf-8 также правильно обрабатываются как в windows, так и в linux.</p>

<p>вы можете использовать этот инструмент: <a href="https://github.com/neurobin/rnm">rnm</a> ( <a href="http://neurobin.github.io/rnm/">веб-страница</a> )</p><p>для вашего случая команда будет:</p><pre><code>rnm -rs '/^image//' *.png </code></pre><p>вы можете найти больше примеров/документов <a href="http://neurobin.github.io/docs/linux/rnm/bulk-rename-in-linux/">здесь</a> .</p>