Linux изменить регистр имен файлов

Обновлено: 07.07.2024

Я должен рекурсивно переименовать полное дерево папок, чтобы нигде не появлялась заглавная буква (это исходный код C++, но это не должно иметь значения).

Бонусные баллы за игнорирование CVS и Subversion version control files/folders. предпочтительным способом будет сценарий shell, поскольку shell должен быть доступен в любом поле Linux.

Были некоторые веские аргументы по поводу деталей переименования файла.

Я думаю, что файлы с одинаковыми строчными именами должны быть перезаписаны; это проблема пользователя. При проверке на случай игнорирования файловой системы, он будет перезаписывать первый с последним тоже.

Я бы рассмотрел A-Z символа и преобразовал их в a-z, все остальное просто вызывает проблемы (по крайней мере, с исходным кодом).

Сценарий был бы необходим для запуска сборки в системе Linux, поэтому я думаю, что изменения в файлах управления версиями CVS или Subversion должны быть опущены. В конце концов, это всего лишь царапина на кассе. Может быть, "export" более подходит.

У меня, например, TREE.wav, ONE.WAV. Я хочу переименовать его в tree.wav, one.wav. Как переименовать все файлы в нижний регистр?

Мне нужно изменить все имена всех файлов в определенном каталоге на строчные буквы, используя скрипт bash. Более того, я не хочу менять имена подкаталогов, как это было предложено в разделе Как переименовать все папки и файлы в нижний регистр на Linux?

Еще меньше мне очень нравится:

В нечувствительных к регистру файловых системах, таких как OS X HFS+ , вы захотите добавить флаг -f :

Краткая версия с использованием команды "rename" :

Это позволяет избежать проблем с переименованием каталогов перед файлами и попыткой переместить файлы в несуществующие каталоги (например, "A/A" в "a/a" ).

Или более подробная версия без использования "rename" .

Последнее позволяет более гибко использовать команду перемещения (например, "svn mv" ).

Для моего собственного здравомыслия при попытке переместить мои файлы на машину Unix мне нужно автоматически переименовать каждый выходной файл в нижний регистр. В настоящее время я просто переименовываю каждый из них вручную, и нечувствительность к регистру совместимости Windows сделает эту.

Есть ли способ переименовать все файлы в определенной папке в верхний регистр с batch file? Я нашел этот код. Но он переименовывает файлы в нижний регистр. Как изменить его, чтобы переименовать в верхний регистр? for /f Tokens=* %f in ('dir /l/b/a-d') do (rename %f %f)

Просто попробуйте следующее, Если вам не нужно заботиться об эффективности.

Блин, вы, ребята/девчонки, любите все усложнять. Воспользуйся:

Это работает, если у вас уже есть или настроена команда переименования (например, через brew install in Mac):

Вот скрипт, который изменяет только файлы, а не имена каталогов, чтобы не путать find :

Я протестировал его, и он работает с именами файлов, содержащими пробелы, всевозможные кавычки и т. д. Это важно, потому что если вы запускаете от имени root один из этих других сценариев в дереве, которое включает файл, созданный

Это работает на CentOS / Red Hat Linux или других дистрибутивах без скрипта rename Perl:

(В некоторых дистрибутивах команда rename по умолчанию исходит из util-linux, и это другой, несовместимый инструмент.)

--принудительное переименование, даже если файл с именем назначения уже существует.

--преобразование имен файлов в нижний регистр во все строчные буквы.

--nows заменяет все последовательности whitespace в имени файла одиночными символами подчеркивания.

Вот мое неоптимальное решение, использующее сценарий Bash shell:

Все папки переименованы правильно, и mv не задает вопросов, когда разрешения не совпадают, а CVS папки не переименованы (к сожалению, управляющие файлы CVS внутри этой папки все еще переименованы).

Поскольку "find -depth" и "find | sort -r" оба возвращают список папок в удобном порядке для переименования, я предпочел использовать "-глубину" для поиска папок.

Использование фиксатора файлов Ларри Уолла:

Это так же просто, как

(где fix -это, конечно, сценарий выше)

Первоначальный вопрос был задан для игнорирования каталогов SVN и CVS, что можно сделать, добавив-prune в команду find. E.g игнорировать CVS:

[edit] я попробовал это сделать, и встраивание строчного перевода в Находку не сработало по причинам, которые я на самом деле не понимаю. Итак, исправьте это следующим образом::

Это небольшой скрипт shell, который делает то, что вы просили:

Обратите внимание на действие-глубина в первой находке.

Не портативный, только Zsh, но довольно лаконичный.

Во-первых, убедитесь, что zmv загружен.

Кроме того, убедитесь, что extendedglob включен:

Для рекурсивно строчных файлов и каталогов, где имя не CVS .

find -depth печатает каждый файл и каталог, причем содержимое каталога печатается перед самим каталогом. $ строчные буквы имени файла.

На Windows эмуляции, такие как Git Bash , могут потерпеть неудачу, потому что Windows не чувствителен к регистру под капотом. Для этого добавьте шаг, который mv 's файл сначала к другому имени, например "$old.tmp", а затем к $new .

Установите пакет rename ,

Эта команда находит все файлы с расширением *.py и преобразует имена файлов в нижний регистр.

Мне нужно было сделать это на установке Cygwin на Windows 7 и я обнаружил, что получил синтаксические ошибки с предложениями сверху, которые я пробовал (хотя, возможно, я пропустил рабочий вариант). Однако это решение прямо из Ubuntu форумов сработало из банки :-)

(NB: ранее Я заменил whitespace подчеркиванием, используя:

В OS X mv -f показывает ошибку "same file", поэтому я переименовываю дважды:

В этой ситуации я бы потянулся к Python, чтобы не оптимистично предполагать пути без пробелов или косых черт. Я также обнаружил, что python2 имеет тенденцию устанавливаться в большем количестве мест, чем rename .

Если вы используете Arch Linux , вы можете установить пакет rename ) из AUR , который предоставляет команду renamexm в виде исполняемого файла /usr/bin/renamexm и страницу руководства вместе с ней.

Это действительно мощный инструмент для быстрого переименования файлов и каталогов.

Преобразование в нижний регистр

Преобразовать в регистр UPPER

Иной выбор

При необходимости вы можете получить образец файла Developers.mp3 отсюда ;)

Это прекрасно работает и на macOS:

Длинное, Но "Работает Без Сюрпризов & Без Установок "

Этот скрипт обрабатывает имена файлов с пробелами, кавычками, другими необычными символами и Юникодом, работает с нечувствительными к регистру файловыми системами и большинством сред Unix-y , в которых установлены bash и awk (т. е. почти все). Он также сообщает о коллизиях, если таковые имеются (оставляя имя файла в верхнем регистре), и, конечно же, переименовывает оба файла в каталоги & и работает рекурсивно. Наконец, он очень легко адаптируется: вы можете настроить команду find для таргетинга на файлы/dirs, которые вы хотите, и вы можете настроить awk для выполнения других манипуляций с именами. Обратите внимание, что под "handles Unicode" я подразумеваю, что он действительно преобразует их случай (а не игнорирует их, как ответы, которые используют tr ).

Рекомендации

Мой сценарий основан на этих превосходных ответах:

Сначала переименуйте каталоги снизу вверх сортировкой -r (где-глубина недоступна), затем файлы. Тогда grep -v /CVS вместо find . -prune , потому что это проще. Для больших каталогов, например f в . может переполнить некоторые буферы shell. Используйте find . | while read , чтобы избежать этого.

И да, это будет сбивать файлы, которые отличаются только в случае.

Почистить Переименовать (regex)

Это не совсем то, что просил OP, но то, что я надеялся найти на этой странице:

Версия "slugify" для переименования файлов, чтобы они были похожи на URLs (т. е. включали только буквенно-цифровые символы, точки и тире):

Похожие вопросы:

Недавно я перенес базу данных из коробки windows в коробку linux. Таблицы смешаны между именами в нижнем и верхнем регистре. Мне нужен способ переименовать все таблицы и столбцы в нижний регистр.

В командной строке Windows как я могу переименовать все файлы в нижний регистр и удалить все пробелы?

У меня есть папка (скажем, ее имя ../TEMPO ) со многими папками внутри [A,B,C..Z] на машине linux. Каждая папка имеет еще 3 уровня папок. Некоторые из более глубоких папок имеют строчные имена.

У меня, например, TREE.wav, ONE.WAV. Я хочу переименовать его в tree.wav, one.wav. Как переименовать все файлы в нижний регистр?

Мне нужно изменить все имена всех файлов в определенном каталоге на строчные буквы, используя скрипт bash. Более того, я не хочу менять имена подкаталогов, как это было предложено в разделе Как.

Для моего собственного здравомыслия при попытке переместить мои файлы на машину Unix мне нужно автоматически переименовать каждый выходной файл в нижний регистр. В настоящее время я просто.

Есть ли способ переименовать все файлы в определенной папке в верхний регистр с batch file? Я нашел этот код. Но он переименовывает файлы в нижний регистр. Как изменить его, чтобы переименовать в.

Мне нужна помощь. Я хочу рекурсивно переименовать все файлы в нижний регистр внутри каталога. У меня есть код для тестирования, но он переименовывается только в этой папке, а не рекурсивно. Как я.

У меня есть большой проект со многими пакетами, которые являются CamelCase. Я хочу переименовать их все в нижний регистр, например: От main.MyPackages.Utils до main.mypackages.utils Каков самый.

У меня есть несколько файлов кода HTML, которые содержат значения атрибутов SRC , подобные этому: Значение 1 <IMG SRC=Trig_IMG/102.jpg WIDTH=309 HEIGHT=106> Стоимость 2 <IMG.


В Linux существует множество способов преобразования строки в верхний или нижний регистр.

Наиболее часто используемыми командами для изменения регистра являются tr, sed и awk.

В Bash 4 есть определенные символы, которые позволяют преобразовать регистр строки.

В этом руководстве мы узнаем, как преобразовать строку в верхний и нижний регистр в системах Linux.

Использование команды TR для преобразования регистра

Команда tr используется для перевода и удаления символов.

С ее помощью можно преобразовать строку или содержимое файла в верхний или нижний регистр.

Она очень часто используется в скриптах bash.

Чтобы преобразовать любую строку из верхнего регистра в нижний, введите:

Чтобы преобразовать любую строку из нижнего регистра в верхний, введите:

Например, можно использовать команду tr в скриптах bash для преобразования строки в нижний регистр

Чтобы преобразовать содержимое текстового файла с именем file.txt из нижнего регистра в верхний, выполните следующие действия.

И наоборот, чтобы преобразовать содержимое файла в нижний регистр, введите

Использование SED для преобразования регистра

Команда Sed используется в Linux для разбора и преобразования текста.

С помощью sed можно преобразовать регистр строки.

Используя sed, чтобы преобразовать строку в верхний регистр, введите

Теперь перейдем на строчные буквы, используя следующую команду:

Чтобы преобразовать текст из файла в верхний регистр с помощью инструмента командной строки sed, мы используем следующий шаблон:

Использование AWK для преобразования регистра

Команда awk использует функции tolower и toupper для преобразования регистра строки.

Чтобы преобразовать строку в верхний регистр, введите

Чтобы преобразовать все содержимое текстового файла с именем file.txt в верхний регистр, используйте:

Аналогично для преобразования в нижний регистр используйте:

Преобразование регистра с помощью символов в Bash

Начиная с версии 4 Bash, появилась новая возможность преобразования регистра строки.

  1. Преобразует первый символ любой строки в верхний регистр ^
  2. Преобразует всю строку в верхний регистр ^^
  3. Преобразует первый символ строки в строчный регистр ,
  4. Преобразует всю строку в строчный регистр. ,,

Символы Bash для преобразования регистра строк

Пример 1

Преобразование первого символа строки с помощью символа ^:

Пример 2:

Преобразование всей переменной bash в верхний регистр с помощью символа ^^:

Пример 3:

Преобразование в нижний регистр с помощью символа .

Заключение

В этой статье мы узнали, как конвертировать в прописные или строчные буквы в Linux.

Я должен рекурсивно переименовать полное дерево папок, чтобы нигде не было заглавных букв (это исходный код C ++, но это не должно иметь значения).

Бонусные баллы за игнорирование файлов / папок контроля версий CVS и Subversion. Предпочтительным способом будет сценарий оболочки, поскольку оболочка должна быть доступна на любом компьютере с Linux.

Были некоторые веские аргументы о деталях переименования файла.

Я думаю, что файлы с одинаковыми строчными именами должны быть перезаписаны; это проблема пользователя. При проверке в файловой системе без учета регистра она также перезаписывает первую на последнюю.

Я хотел бы рассмотреть символы AZ и преобразовать их в az, все остальное просто вызывает проблемы (по крайней мере, с исходным кодом).

Сценарий понадобится для запуска сборки в системе Linux, поэтому я думаю, что изменения в файлах управления версиями CVS или Subversion должны быть опущены. В конце концов, это просто проверка заказа. Может быть, «экспорт» более уместен.

Ранее опубликованные данные будут отлично работать "из коробки" или с некоторыми изменениями для простых случаев, но есть некоторые ситуации, которые вы можете принять во внимание перед запуском пакетного переименования: 1. Что должно произойти, если у вас есть два или более имен в один и тот же уровень в иерархии путей, которые отличаются только регистром, например ABCdef , abcDEF и aBcDeF ? Должен ли сценарий переименования прерваться или просто предупредить и продолжить? 2. Как вы определяете нижний регистр для не-US-ASCII имен? Если такие имена могут присутствовать, следует ли сначала выполнить проверку и исключить проход? 3. Если вы выполняете операцию переименования

Краткая версия с помощью "rename" команды:

Это позволяет избежать проблем с переименованием каталогов перед файлами и попыткой перемещения файлов в несуществующие каталоги (например, "A/A" в "a/a" ).

Или более подробная версия без использования "rename" .

Последнее обеспечивает большую гибкость с помощью команды перемещения (например, "svn mv" ).

использовать переименование можно так же, как переименование 'y / AZ / az /' * Осторожно, обе версии не будут работать в нечувствительной к регистру файловой системе. В моем случае я заменил- then закрытую строку на (mv "$" "$.renametmp" && mv "$.renametmp" "$") || echo "$ was not renamed" . Второй подход не работал правильно для меня с файлами, содержащими пробелы (контекст: linux, bash). Используя последнюю версию переименования, регулярное выражение не требуется. Полная команда становится find my_root_dir -depth -exec rename -c <> \; . Добавьте -f для переименования, если вы используете файловую систему без Второй сработал для меня в Solaris, удалив команду -T из mv команды.

Меньше все же мне очень нравится

В нечувствительных к регистру файловых системах, таких как HFS + в OS X , вы захотите добавить -f флаг:

Спасибо, я использовал это таким образом $ find | xargs переименовывает 'y / AZ / az /' * Это предполагает, что у вас есть perls rename, что не всегда так. например на моем debian переименование совершенно другое На Arch программа называется perl-rename (и предоставляется пакетом с таким же именем) Это не решает данную проблему, так как «переименование» не является рекурсивным. Пожалуйста, сделайте «mkdir -p A / B / C» перед запуском вашего скрипта. «find» следует заменить любой командой, которую вы используете, чтобы получить список файлов, которые вы хотите переименовать; например, "ls *. ". «Консолидированная» версия, из всех комментариев (ответ больше не может быть отредактирован): for f in `find .`; do mv -v "$f" "`echo $f | tr '[A-Z]' '[a-z]'`"; done

Просто попробуйте следующее, если вам не нужно заботиться об эффективности.

Предполагая, что вычислительная эффективность обычно НЕ является проблемой, когда вам нужно переименовать файлы в каталоге . Я думаю, что это, вероятно, самое творчески простое решение в этой теме. На самом деле, эта тривиальная задача не должна быть такой сложной, как демонстрируют принятые ответы, и этот обходной путь гораздо более пропорционален тому, сколько мыслей я хочу инвестировать в такую ​​операцию, как эта. +1000 Вы можете ускорить его с помощью -0 переключателя (это «ноль», без сжатия) zip -0 -r foo.zip foo/ . Мне пришлось изменить более 50 000 имен файлов в разных структурах каталогов. Первоначально принятый ответ выполнил лишь 10% работы за 2 минуты, где это, со -0 сжатием, было почти мгновенным! Это не просто неэффективно. Это просто невозможно, если для временного архива недостаточно свободного места.

Чувак, вы, ребята, любите усложнять вещи . Использование:

Это не работает, он говорит, что файл с именем в нижнем регистре уже существует. @kirhgoff Я видел, как это происходит с монтированием NFS - следуйте инструкциям здесь . Как мы можем переименовать в чувствительной к регистру файловой системе? rename 'y/a-z/A-Z/' /tmp/*.jpg -> Can't rename /tmp/*.jpg /TMP/*.JPG: No such file or directory , т.е. попробуйте переименовать весь путь, а не только файл.

Вот скрипт, который изменяет только файлы, а не имена каталогов, чтобы не перепутать find :

Я протестировал его, и он работает с именами файлов, содержащими пробелы, всевозможные кавычки и т. Д. Это важно, потому что если вы запускаете от имени root один из тех других сценариев в дереве, который включает файл, созданный

Это работает, если у вас уже есть или настроена команда переименования (например, через brew install в Mac):

. если вы сначала настроите переименование, например, через brew install rename rename это не встроенный bash. Это внешняя утилита, и ее синтаксис зависит от версии, которую вы установили. Этот ответ не является достаточным в качестве портативного решения "для всех ОС на основе Unix", как утверждается. Только что проверил, rename команда, включенная в последнюю Fedora (28) через util-linux-2.31 пакет, не имеет --lower-case опции.

Это работает на CentOS / Red Hat Linux или других дистрибутивах без rename сценария Perl:

(В некоторых дистрибутивах команда по умолчанию rename взята из util-linux, а это другой несовместимый инструмент.)

Это работает только для одного каталога, а не рекурсивно

--force Переименовать, даже если файл с именем назначения уже существует.

--lower-case Конвертировать имена файлов в нижний регистр.

--nows Заменить все последовательности пробелов в имени файла символами подчеркивания.

Вот мое неоптимальное решение с использованием сценария оболочки Bash:

Все папки переименованы правильно и mv не задают вопросов, когда разрешения не совпадают, а папки CVS не переименовываются (к сожалению, контрольные файлы CVS внутри этой папки все еще переименовываются).

Поскольку «find -depth» и «find | sort -r» оба возвращают список папок в порядке, пригодном для переименования, я предпочел использовать «-depth» для поиска папок.

Ваша первая находка не работает. Попробуйте «mkdir -p A / B / C» и затем запустите ваш скрипт.

Первоначальный вопрос касался игнорирования каталогов SVN и CVS, что можно сделать, добавив -prune к команде find. Например, игнорировать CVS:

Используя средство для исправления имени Ларри Уолла:

Это так просто, как

(где fix конечно сценарий выше)

Это небольшой сценарий оболочки, который делает то, что вы просили:

Обратите внимание на действие -depth в первой находке.

Единственное, что работало на Mac из целого потока. Спасибо, куча!

Не портативный, только Zsh, но довольно лаконичный.

Сначала убедитесь, что zmv загружен.

Также убедитесь, что extendedglob :

Для рекурсивных строчных файлов и каталогов, где имя не CVS .

find -depth печатает каждый файл и каталог с содержимым каталога, напечатанным перед самим каталогом. $ строчные буквы имени файла.

Это не работает: он переименовывает каталог до того, как работает с содержимым, так что последующая попытка содержимого не удалась. Добавление -depth исправляет это! Это действительно быстрое решение, но, конечно, без -print0 возможности найти, оно не самое надежное @jpaugh Нет, это не так. Он попытается переименовать ./FOO/BAR в ./foo/bar, но ./foo еще не существует.

Установить rename пакет,

Эта команда находит все файлы с *.py расширением и преобразует имена файлов в нижний регистр.

- I Флаг не является обязательным. Он используется, когда мы выполняем несколько команд с xargs . Ниже приведен пример использования нескольких команд с xargs cat foo.txt | xargs -I % sh -c 'echo %; mkdir %' Вами может работать без -I как find . -iname "*.py" -type f | xargs -I% rename -c -f "%"

В Windows эмуляции, такие как Git Bash , могут не работать, поскольку Windows не учитывает регистр. Для них сначала добавьте шаг, который mv является файлом, к другому имени, например, «$ old.tmp», а затем к $new .

Длительный, но "Работает без сюрпризов и без установок"

Этот скрипт обрабатывает имена файлов с пробелами, кавычками, другими необычными символами и Unicode, работает с нечувствительными к регистру файловыми системами и большинством сред Unix-y , в которых установлены bash и awk (т.е. почти все). Он также сообщает о коллизиях, если таковые имеются (оставляя имя файла в верхнем регистре) и, конечно, переименовывает как файлы, так и каталоги и работает рекурсивно. Наконец, он легко адаптируется: вы можете настроить команду find для выбора нужных вам файлов / каталогов и настроить awk для других манипуляций с именами. Обратите внимание, что под «ручками Unicode» я подразумеваю, что он действительно преобразует их регистр (а не игнорирует их как ответы, которые используют tr ).

Ссылки

Мой сценарий основан на этих превосходных ответах:

Это хорошо работает и в macOS:

Это особенно приятно, поскольку Ruby поставляется с macOS.

Мне нужно было сделать это на установке Cygwin в Windows 7 и обнаружил, что я получил синтаксические ошибки с предложениями из вышеупомянутого, которые я попробовал (хотя, возможно, я пропустил рабочий вариант). Однако, это решение прямо с форумов Ubuntu сработало из банки :-)

(Примечание: ранее я заменил пробел подчеркиванием, используя:

В OS X mv -f показывает ошибку «тот же файл», поэтому я переименовываю дважды:

В этой ситуации я хотел бы обратиться к Python, чтобы избежать оптимистического предположения путей без пробелов и косых черт. Я также обнаружил, что, python2 как правило, устанавливается в большем количестве мест, чем rename .

Разговор о усложнении . просто сделайте .. переименуйте 'y / AZ / az /' * @Stephen, который предполагает, что у вас есть права администратора для установки переименования. Мне часто приходится извлекать данные в системах, на которых у меня нет возможности устанавливать другое программное обеспечение. В последних версиях Ubuntus он устанавливается только при наличии perl.

Если вы используете Arch Linux , вы можете установить rename пакет, AUR который предоставляет renamexm команду как /usr/bin/renamexm исполняемый файл и страницу руководства вместе с ней.

Это действительно мощный инструмент для быстрого переименования файлов и каталогов.

Преобразовать в нижний регистр

Преобразовать в верхний регистр

Другие варианты

Вы можете получить образец файла Developers.mp3 отсюда , если это необходимо;)

переименование brew в MacOS -l связано с созданием символической ссылки и -c преобразованием в строчные буквы, так что будьте внимательны.

Сначала переименуйте каталоги снизу вверх сортировки -r (где -depth недоступен), затем файлы. Тогда grep -v / CVS вместо find . - prune, потому что это проще. Для больших каталогов, если f in . может переполнить некоторые буферы оболочки. Используйте поиск . | в то время как читать, чтобы избежать этого.

И да, это будет забивать файлы, которые отличаются только в случае .

Во-первых, find YOURDIR -type d | sort -r это слишком много проблем. Вы хотите find YOURDIR -depth -type d . Во-вторых, find -type f ДОЛЖЕН выполняться после того, как каталоги были переименованы.

Я не пробовал более сложные сценарии, упомянутые здесь, но ни одна из версий командной строки не работала для меня на моем Synology NAS. rename нет в наличии, и многие из вариантов find не потому , что он , кажется, прилипает к старшему имени уже переименованный путь (например, если он находит ./FOO затем ./FOO/BAR , не переименовывая ./FOO к ./foo прежнему будет продолжать список , ./FOO/BAR даже если этот путь больше не действует) , Выше команда работала у меня без проблем.

Далее следует объяснение каждой части команды:

При этом будет найден любой файл из текущего каталога (перейдите . в любой каталог, который вы хотите обработать), используя поиск в глубину (например, он будет перечислен ./foo/bar раньше ./foo ), но только для файлов, которые содержат заглавные буквы. -name Фильтр применяется только к базовому имени файла, а не полный путь. Так что это будет список, ./FOO/BAR но нет ./FOO/bar . Это нормально, так как мы не хотим переименовывать ./FOO/bar . Мы хотим переименовать ./FOO хотя, но это перечислено позже (вот почему -depth важно).

Сама по себе эта команда особенно полезна для поиска файлов, которые вы хотите переименовать. Используйте эту команду после полной команды переименования для поиска файлов, которые еще не были заменены из-за конфликтов имен или ошибок.

Эта часть читает файлы, выводимые find и форматирует их в mv команде с помощью регулярного выражения. -n Опция прекращает sed печатать вход, и p команда в поисковых и замены регулярных выражений выходов замененного текста.

Само регулярное выражение состоит из двух захватов: части вплоть до последней / (которая является каталогом файла) и самого имени файла. Каталог оставлен без изменений, но имя файла преобразуется в нижний регистр. Так что, если find выходы ./FOO/BAR , то станет mv -n -v -T ./FOO/BAR ./FOO/bar . -n Вариант mv убеждается существующие строчных файлы не будут перезаписаны. -v Опция делает mv вывод каждое изменение , что он делает (или не делает - если ./FOO/bar уже существует, то он выдает что - то вроде ./FOO/BAR -> ./FOO/BAR , отметив , что никаких изменений не было сделано). Здесь -T очень важно - он рассматривает целевой файл как каталог. Это позволит убедиться, что ./FOO/BAR он не перемещен, ./FOO/bar если этот каталог существует.

Используйте это вместе с, find чтобы сгенерировать список команд, которые будут выполнены (удобно, чтобы проверить, что будет сделано, фактически не делая этого)

Это довольно очевидно. Он направляет все сгенерированные mv команды в интерпретатор оболочки. Вы можете заменить его bash или любую оболочку по своему вкусу.

Я должен рекурсивно переименовать полное дерево папок, чтобы нигде не появлялась заглавная буква (это исходный код C++, но это не имеет значения). Бонусные баллы за игнорирование файлов/папок управления CVS и SVN. Предпочтительным способом будет сценарий оболочки, так как оболочка должна быть доступна в любой Linux-системе.

были некоторые допустимые аргументы о деталях переименования файла.

Я думаю, что файлы с одинаковыми именами в нижнем регистре должны быть перезаписаны, это проблема пользователя. При проверке на случай игнорирования файловой системы будет перезаписать первый с последним, тоже.

Я бы рассмотрел символы A-Z и преобразовал их в a-z, все остальное просто вызывает проблемы (по крайней мере, с исходным кодом).

скрипт потребуется для запуска сборки в системе Linux, поэтому я думаю, что изменения в файлах управления CVS или SVN следует опустить. В конце концов, это всего лишь царапина. Возможно "экспорт" более уместен.

краткая версия с использованием .

это позволяет избежать проблем с каталогами, которые переименовываются перед файлами и пытаются переместить файлы в несуществующие каталоги (например, "A/A" на "a/a" ).

или, более подробная версия без использования "rename" .

последняя позволяет более гибко с помощью команды переместить (электронная. г. "svn mv" ).

еще меньше мне нравится

в нечувствительных к регистру файловых системах, таких как HFS+ OS X, вы захотите добавить флаг-f

просто попробуйте следовать, если вам не нужно заботиться об эффективности.

я протестировал его, и он работает с именами файлов, содержащими пробелы,все виды кавычек и т. д. Это важно, потому что если вы запустите, как root, один из тех других скриптов в дереве, который включает файл, созданный:

это работает если у вас уже есть или создать переименовать команда (например, через brew install в Mac):

человек, которого вы, ребята, любите усложнять вещи..

переименовать ' y/A-Z/ a-z/'*

использование имени файла фиксаж Ларри Уолла

(где fix, конечно, сценарий выше)

исходный вопрос, заданный для игнорирования каталогов SVN и CVS, что можно сделать, добавив-prune в команду find. Например, игнорировать CVS:

[edit] я попробовал это, и внедрение перевода нижнего регистра внутри находки не сработало по причинам, которые я на самом деле не понимаю. Итак, измените это на:

вот мое неоптимальное решение, используя скрипт оболочки bash:

Edit: я внес некоторые изменения, основанные на предложениях до сих пор. Теперь все папки переименованы правильно, mv не задает вопросов, когда разрешения не совпадают, и папки CVS не переименованы (файлы управления CVS внутри этой папки все еще переименованы, к сожалению).

Edit: поскольку "find-depth" и "find | sort-r" оба возвращают список папок в удобном порядке для переименования, я предпочел использование "- depth " для поиска папок.

Это небольшой скрипт, который делает то, что вы просили:

обратите внимание на действие-depth в первом поиске.

это работает на CentOS / Redhat или других дистрибутивах без rename Perl-скрипт:

(в некоторых дистрибутивах по умолчанию rename команда исходит от util-linux, и это другой, несовместимый инструмент)

ранее опубликованный будет работать отлично из коробки или с несколькими корректировками для простых случаев, но есть некоторые ситуации, которые вы можете принять во внимание перед запуском переименования пакета:

что должно произойти, если у вас есть два или более имен на одном уровне в иерархии путей, которые отличаются только в зависимости от случая, например ABCdef , abcDEF и aBcDeF ? Должен ли скрипт rename прерваться или просто предупредить и продолжить?

как сделать определите нижний регистр для нас-ASCII названий? Если такие имена могут присутствовать, следует ли сначала проверить и исключить пропуск?

Если вы выполняете операцию переименования на рабочих копиях CVS или SVN, вы можете повредить рабочую копию при изменении имени файла или каталога. Должен ли скрипт также находить и настраивать внутренние административные файлы, такие как .svn / записи или CVS / записи?

установить rename пакет,

эта команда найти все файлы с

не портативный, только Zsh, но довольно лаконичный.

во-первых, убедитесь, что zmv загружается.

кроме того, убедитесь, что extendedglob на:

для рекурсивно строчных файлов и каталогов, где имя не CVS.

в OSX mv-f показывает ошибку "тот же файл", поэтому я переименовываю дважды.

Я бы потянулся к python в этой ситуации, чтобы избежать оптимистически предполагаемых путей без пробелов или косых черт. Я также обнаружил, что python2 имеет тенденцию устанавливаться в большем количестве мест, чем rename .

find -depth печатает каждый файл и каталог, причем содержимое каталога печатается перед самим каталогом. $ строчные буквы имени файла.

сначала переименуйте каталоги снизу вверх сортировка-r (где-глубина недоступна), затем файлы. Тогда grep-v /CVS вместо найти . - чернослив!--3--> потому что это проще. Для больших каталогов для f in . может переполнить некоторые буферы оболочки. Использовать найти . | пока читаем чтобы избежать этого.

и да, это будет clobber файлы, которые отличаются только в случае.

Slugify переименовать (регулярное выражение)

не совсем то, что ОП попросил, но то, что я надеялся найти на этой странице:

версия "slugify" для переименования файлов, чтобы они были похожи на URLs
(т. е. включать только буквенно-цифровые, точки и тире):

мне нужно было сделать это на установке cygwin в Windows 7 и обнаружил, что я получил синтаксические ошибки с предложениями сверху, которые я пробовал (хотя я, возможно, пропустил рабочий вариант), однако это решение прямо из форумы ubutu работал из банки :-)

(nb я ранее заменял пробелы подчеркиванием с помощью

если вы используете Arch Linux, вы можете установить rename пакета из AUR обеспечивает renamexm команда as /usr/bin/renamexm исполняемый файл и его руководство страница вместе с ней.

это действительно мощный инструмент для быстрого переименования файлов и каталогов.

преобразовать в нижний регистр

преобразовать в верхний регистр

другие функции

Вы можете принести образец разработчики.mp3 файл из здесь, если нужно ;)

никто не предлагает набор?

на эмуляциях windows, таких как Git bash, это может завершиться неудачей, потому что windows не чувствительна к регистру под капотом. Для них добавьте шаг, который mv-это файл с другим именем, например " $old.tmp", затем до $new.

Длительным, Но "Работает Без Сюрпризов И Без Установки"

этот скрипт обрабатывает имена файлов пробелами, кавычками, другими необычно символы и Unicode, работает на нечувствительных к регистру файловых системах и большинстве Unix-y сред которые имеют установленные bash и awk (т. е. почти все). Он также сообщает о коллизиях, если таковые имеются (оставляя имя файла в верхнем регистре) и, конечно, переименовывает файлы и каталоги и работает рекурсивно. Наконец, это очень адаптируемо: вы можете настроить команду find для целевых файлов/dirs, которые вы хотите, и вы можете настроить awk для других манипуляций с именами. Обратите внимание, что под "ручками Unicode" я имею в виду, что он действительно преобразует их случай (не игнорируйте их, как ответы, которые используют tr ).

Читайте также: