Уменьшение всех каталогов под каталогом

Я хочу записать каждое имя каталогов под каталогом. С какими командами я могу это сделать?

3 Solutions collect form web for “Уменьшение всех каталогов под каталогом”

Все каталоги на одном уровне или рекурсивно?

Zsh

На одном уровне:

autoload zmv zmv -oi -Q 'root/(*)(/)' 'root/${1:l}' 

Рекурсивный:

 zmv -oi -Q 'root/(**/)(*)(/)' 'root/$1${2:l}' 

Объяснения: zmv переименовывает файлы, соответствующие шаблону в соответствии с данным текстом замены. -oi передает параметр -i для каждой команды mv под капотом (см. ниже). В заменяющем тексте $1 , $2 и т. Д. Являются последовательными скобками в шаблоне. ** означает все (под) * каталоги, рекурсивно. Финал (/) не является группой в скобках, но квалификатором glob означает соответствие только каталогов. ${2:l} преобразует $2 в нижний регистр.

портативный

На одном уровне:

 for x in root/*/; do mv -i "$x" "$(printf %s "$x" | tr '[:upper:]' '[:lower:]')"; done 

Финал / ограничивает соответствие каталогов, а mv -i запрашивает подтверждение при столкновении. Удалите -i чтобы перезаписать в случае столкновения, и используйте yes n | for … yes n | for … чтобы не было предложено и не выполнялось какое-либо переименование, которое могло бы столкнуться.

Рекурсивный:

 find root/* -depth -type d -exec sh -c ' t=${0%/*}/$(printf %s "${0##*/}" | tr "[:upper:]" "[:lower:]"); [ "$t" = "$0" ] || mv -i "$0" "$t" ' {} \; 

Использование -depth гарантирует, что глубоко вложенные каталоги обрабатываются перед своими предками. Обработка имен зависит от наличия / ; если вы хотите вызвать ./* в текущем каталоге, используйте ./* (адаптация сценария оболочки для ./* с помощью . или * остается в качестве упражнения для читателя).

Перл переименовать

Здесь я использую скрипт переименования Perl, который Debian и Ubuntu отправляют как /usr/bin/prename (обычно доступны как rename ). На одном уровне:

 rename 's!/([^/]*/?)$!\L/$1!' root/*/ 

Рекурсивно, с bash ≥4 или zsh:

 shopt -s globstar # only in bash rename 's!/([^/]*/?)$!\L/$1!' root/**/*/ 

Рекурсивно, портативно:

 find root -depth -type d -exec rename -n 's!/([^/]*/?)$!\L/$1!' {} + 

Не существует одной команды, которая сделает это, но вы можете сделать что-то вроде этого:

 for fd in */; do #get lower case version fd_lower=$(printf %s "$fd" | tr AZ az) #if it wasn't already lowercase, move it. [ "$fd" != "$fd_lower" ] && mv "$fd" "$fd_lower" done 

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

Как однострочный:

 for fd in */; do fd_lower=$(printf %s "$fd" | tr AZ az) && [ "$fd" != "$fd_lower" ] && mv "$fd" "$fd_lower"; done 

Я воспринял это как вызов с одним лайнером 🙂 Сначала создайте тестовый пример:

 $ for d in foo Bar eVe; do mkdir -p dcthis/$d; touch dcthis/a${d}.txt; done $ ls dcthis/ Bar aBar.txt aeVe.txt afoo.txt eVe foo 

Я использую find чтобы определить каталоги с прописными буквами, а затем опустить их через sh -c 'mv {} echo {} | tr [:upper:] [:lower:] ' sh -c 'mv {} echo {} | tr [:upper:] [:lower:] ' . Угадай, что использовать sh -c немного хак-иш, но моя голова всегда взрывается, когда я пытаюсь избежать непосредственного find вещей.

 $ (cd dcthis && find . -maxdepth 1 -type d -path '*[AZ]*' -exec sh -c 'mv {} `echo {} | tr [:upper:] [:lower:]`' \;) $ ls dcthis/ aBar.txt aeVe.txt afoo.txt bar eve foo 

Будьте осторожны: это решение не проверяет, приводит ли перепад в столкновение!

  • переместите файл, соответствующий шаблону в сценарии оболочки
  • Как переименовать несколько файлов с помощью сценария оболочки?
  • пакетное переименование нескольких файлов
  • mv файлы на другой путь, который создается с помощью замены регулярных выражений
  • Как я могу найти файлы, а затем использовать xargs для их перемещения?
  • Shell Script для перемещения папок, содержащих определенное слово
  • Селективный рекурсивный ход?
  • Как получить команду find и rename для работы с подкаталогами?
  • Каков наиболее эффективный способ перемещения большого количества файлов, которые находятся в одном каталоге?
  • Как перезаписать файлы-мишени с помощью mv?
  • Как рекурсивно добавлять нули в имя файла
  • Переименуйте каталоги с "fname lname" на "lname, fname "
  • Interesting Posts

    Использование ~ / .ssh / authorized_keys для пользователей без полномочий root?

    После удаления файла истории, почему у меня все еще есть более старые команды в истории?

    Fedora 28 работает на сервере Apache и в приложении Laravel

    Сбой ядра с программным RAID-1 из-за ошибок чтения одного диска

    Как я могу сделать графические символы для вывода на экран терминала Debian 8?

    как отредактировать и покрасить список завершения вкладки bash

    Реинсталляция библиотеки NSS в CentOS (Amazon AMI)

    Безопасно отключить загрузку fsck в файловой системе ext3 только для чтения?

    Когда пробелы вокруг знака = запрещены?

    Быстрая элиминация повторяющихся строк по нескольким файлам

    Отключает ли барьеры для безопасности ext4 на ноутбуке с батареей?

    после входа в систему ssh и во время обновления apt-get, неправильно ли выходить из системы?

    kernel: "echo 0> / proc / sys / kernel / hung_task_timeout_secs"

    UDF и fstab (без UUID)

    Скользящее среднее в файле журнала с awk или другими утилитами unix?

    Linux и Unix - лучшая ОС в мире.