Linux - переименуйте все папки в верхние в месте назначения - PullRequest
3 голосов
/ 30 марта 2012

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

A/F/m/O
Z/t/q/S

На 4-м уровне есть файлы, которые я хотел бы сохранить с тем же именем, что и сейчас.

Какможно рекурсивно переименовать только имя папки в верхний регистр, не меняя имя файла, существующее в определенной папке (../TEMPO)?

Ответы [ 4 ]

4 голосов
/ 30 марта 2012

Проверьте вывод этой команды

find path/to/dir -type d | awk -F"/" '$NF != toupper($NF) {l = n = $0; sub($NF "$", toupper($NF), n); print "mv " l " " n;}' | tac

и, если все выглядит хорошо, запустите результаты, отправив результаты в sh

find path/to/dir -type d | awk -F"/" '$NF != toupper($NF) {l = n = $0; sub($NF "$", toupper($NF), n); print "mv " l " " n;}' | tac | sh
2 голосов
/ 30 марта 2012

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

Инструмент для достижения - это утилита rename, которая поставляется с Perl; Я не могу найти его документацию в Интернете, или я бы дал ссылку на него. Если набрать man rename в командной строке, появится что-то вроде этого:

NAME
       rename - renames multiple files

SYNOPSIS
       rename [ -v ] [ -n ] [ -f ] perlexpr [ files ]

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

Поскольку вы знаете, что у вас есть четыре уровня каталогов с односимвольными именами, вы можете просто перечислить уровни каталогов, например:

rename 'y/a-z/A-Z/ if -d $_' ?
rename 'y/a-z/A-Z/ if -d $_' ?/?
rename 'y/a-z/A-Z/ if -d $_' ?/?/?
rename 'y/a-z/A-Z/ if -d $_' ?/?/?/?

Если бы могло быть произвольное вложение, вы должны были бы быть умнее.

2 голосов
/ 30 марта 2012

Это может работать для вас:

for dir in `find ./TEMPO -type d -regex '.*[a-z].*' -print` ; do
    udir=`echo $dir | tr [a-z] [A-Z]`
    mv $dir $udir
done
0 голосов
/ 30 марта 2012

Если у вас есть prename, который является частью perl, вы можете сделать это очень легко:

find ../TEMPO -depth -type d | xargs prename 's%/([^/]+)$%/\U$1%'

Вы можете сначала передать -n на prename, чтобы проверитьэто будет правильно делать.

...