Я должен рекурсивно переименовать полное дерево папок, чтобы нигде не было заглавных букв (это исходный код C ++, но это не должно иметь значения).
Бонусные баллы за игнорирование файлов / папок контроля версий CVS и Subversion. Предпочтительным способом будет сценарий оболочки, поскольку оболочка должна быть доступна на любом компьютере с Linux.
Были некоторые веские аргументы о деталях переименования файла.
Я думаю, что файлы с одинаковыми строчными именами должны быть перезаписаны; это проблема пользователя. При проверке в файловой системе без учета регистра она также перезаписывает первую на последнюю.
Я хотел бы рассмотреть символы AZ и преобразовать их в az, все остальное просто вызывает проблемы (по крайней мере, с исходным кодом).
Сценарий понадобится для запуска сборки в системе Linux, поэтому я думаю, что изменения в файлах управления версиями CVS или Subversion должны быть опущены. В конце концов, это просто проверка заказа. Может быть, «экспорт» более уместен.
ABCdef
,abcDEF
иaBcDeF
? Должен ли сценарий переименования прерваться или просто предупредить и продолжить? 2. Как вы определяете нижний регистр для не-US-ASCII имен? Если такие имена могут присутствовать, следует ли сначала выполнить проверку и исключить проход? 3. Если вы выполняете операцию переименованияОтветы:
Краткая версия с помощью
"rename"
команды:Это позволяет избежать проблем с переименованием каталогов перед файлами и попыткой перемещения файлов в несуществующие каталоги (например,
"A/A"
в"a/a"
).Или более подробная версия без использования
"rename"
.PS
Последнее обеспечивает большую гибкость с помощью команды перемещения (например,
"svn mv"
).источник
then
закрытую строку на(mv "${SRC}" "${DST}.renametmp" && mv "${DST}.renametmp" "${DST}") || echo "${SRC} was not renamed"
.find my_root_dir -depth -exec rename -c {} \;
. Добавьте -f для переименования, если вы используете файловую систему без-T
изmv
команды.Меньше все же мне очень нравится
В нечувствительных к регистру файловых системах, таких как HFS + в OS X , вы захотите добавить
-f
флаг:источник
The renaming utility that comes by default with Ubuntu is a Perl program sometimes called prename
perl-rename
(и предоставляется пакетом с таким же именем)источник
find
.find .
кажется, это исправить.for f in `find .`; do mv -v "$f" "`echo $f | tr '[A-Z]' '[a-z]'`"; done
Просто попробуйте следующее, если вам не нужно заботиться об эффективности.
источник
-0
переключателя (это «ноль», без сжатия)zip -0 -r foo.zip foo/
.-0
сжатием, было почти мгновенным!Чувак, вы, ребята, любите усложнять вещи ... Использование:
источник
rename 'y/a-z/A-Z/' /tmp/*.jpg
->Can't rename /tmp/*.jpg /TMP/*.JPG: No such file or directory
, т.е. попробуйте переименовать весь путь, а не только файл.Большинство ответов выше опасны, потому что они не имеют дело с именами, содержащими нечетные символы. Ваш безопасный выбор для такого рода вещи , чтобы использовать
find
«s-print0
вариант, который будет прекратить имена файлов с ASCII NUL вместо \ п.Вот скрипт, который изменяет только файлы, а не имена каталогов, чтобы не перепутать
find
:Я протестировал его, и он работает с именами файлов, содержащими пробелы, всевозможные кавычки и т. Д. Это важно, потому что если вы запускаете от имени root один из тех других сценариев в дереве, который включает файл, созданный
... ну угадай что ...
источник
rename
вместоmv
.Это работает, если у вас уже есть или настроена команда переименования (например, через brew install в Mac):
источник
brew install rename
--lower-case
? К сожалению, в Arch Linux это не так.rename
это не встроенный bash. Это внешняя утилита, и ее синтаксис зависит от версии, которую вы установили. Этот ответ не является достаточным в качестве портативного решения "для всех ОС на основе Unix", как утверждается.rename
команда, включенная в последнюю Fedora (28) черезutil-linux-2.31
пакет, не имеет--lower-case
опции.Это работает на CentOS / Red Hat Linux или других дистрибутивах без
rename
сценария Perl:Источник: переименовать все имена файлов из прописных в строчные
(В некоторых дистрибутивах команда по умолчанию
rename
взята из util-linux, а это другой несовместимый инструмент.)источник
Самым простым подходом, который я нашел в Mac OS X, было использование пакета переименования с http://plasmasturm.org/code/rename/ :
источник
Вот мое неоптимальное решение с использованием сценария оболочки Bash:
Все папки переименованы правильно и
mv
не задают вопросов, когда разрешения не совпадают, а папки CVS не переименовываются (к сожалению, контрольные файлы CVS внутри этой папки все еще переименовываются).Поскольку «find -depth» и «find | sort -r» оба возвращают список папок в порядке, пригодном для переименования, я предпочел использовать «-depth» для поиска папок.
источник
Первоначальный вопрос касался игнорирования каталогов SVN и CVS, что можно сделать, добавив -prune к команде find. Например, игнорировать CVS:
[править] Я попробовал это, и встраивание перевода в нижний регистр в находку не сработало по причинам, которые я на самом деле не понимаю Итак, измените это на:
Ян
источник
Используя средство для исправления имени Ларри Уолла:
Это так просто, как
(где
fix
конечно сценарий выше)источник
Это небольшой сценарий оболочки, который делает то, что вы просили:
Обратите внимание на действие -depth в первой находке.
источник
Не портативный, только Zsh, но довольно лаконичный.
Сначала убедитесь, что
zmv
загружен.Также убедитесь, что
extendedglob
:Тогда используйте:
Для рекурсивных строчных файлов и каталогов, где имя не CVS .
источник
find -depth
печатает каждый файл и каталог с содержимым каталога, напечатанным перед самим каталогом.${f,,}
строчные буквы имени файла.источник
-depth
исправляет это! Это действительно быстрое решение, но, конечно, без-print0
возможности найти, оно не самое надежноеС MacOS,
Установить
rename
пакет,Использование,
Эта команда находит все файлы с
*.py
расширением и преобразует имена файлов в нижний регистр.Например,
источник
-I
опцию дляxargs
здесь?- I
Флаг не является обязательным. Он используется, когда мы выполняем несколько команд сxargs
. Ниже приведен пример использования нескольких команд сxargs
cat foo.txt | xargs -I % sh -c 'echo %; mkdir %'
Вами может работать без-I
какfind . -iname "*.py" -type f | xargs -I% rename -c -f "%"
Используйте typeset :
В Windows эмуляции, такие как Git Bash , могут не работать, поскольку Windows не учитывает регистр. Для них сначала добавьте шаг, который
mv
является файлом, к другому имени, например, «$ old.tmp», а затем к$new
.источник
Длительный, но "Работает без сюрпризов и без установок"
Этот скрипт обрабатывает имена файлов с пробелами, кавычками, другими необычными символами и Unicode, работает с нечувствительными к регистру файловыми системами и большинством сред Unix-y , в которых установлены bash и awk (т.е. почти все). Он также сообщает о коллизиях, если таковые имеются (оставляя имя файла в верхнем регистре) и, конечно, переименовывает как файлы, так и каталоги и работает рекурсивно. Наконец, он легко адаптируется: вы можете настроить команду find для выбора нужных вам файлов / каталогов и настроить awk для других манипуляций с именами. Обратите внимание, что под «ручками Unicode» я подразумеваю, что он действительно преобразует их регистр (а не игнорирует их как ответы, которые используют
tr
).Ссылки
Мой сценарий основан на этих превосходных ответах:
/unix/9496/looping-through-files-with-spaces-in-the-names
Как преобразовать строку в нижний регистр в Bash?
источник
Это хорошо работает и в macOS:
источник
Мне нужно было сделать это на установке Cygwin в Windows 7 и обнаружил, что я получил синтаксические ошибки с предложениями из вышеупомянутого, которые я попробовал (хотя, возможно, я пропустил рабочий вариант). Однако, это решение прямо с форумов Ubuntu сработало из банки :-)
(Примечание: ранее я заменил пробел подчеркиванием, используя:
)
источник
В OS X
mv -f
показывает ошибку «тот же файл», поэтому я переименовываю дважды:источник
В этой ситуации я хотел бы обратиться к Python, чтобы избежать оптимистического предположения путей без пробелов и косых черт. Я также обнаружил, что,
python2
как правило, устанавливается в большем количестве мест, чемrename
.источник
Если вы используете 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
или любую оболочку по своему вкусу.источник
Slugify Rename (регулярное выражение)
Это не совсем то, о чем просил ФП, но то, что я надеялся найти на этой странице:
Версия «slugify» для переименования файлов, чтобы они были похожи на URL-адреса (т. Е. Включают только буквенно-цифровые, точки и тире):
источник