GNU/Linux >> Linux Esercitazione >  >> Linux

Minuscolo di tutte le directory in una directory?

Voglio mettere in minuscolo il nome di ogni directory in una directory. Con quali comandi posso farlo?

Risposta accettata:

Tutte le directory a un livello o ricorsivamente?

Zsh

A un livello:

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

Ricorsivamente:

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

Spiegazioni:zmv rinomina i file che corrispondono a un modello in base al testo sostitutivo specificato. -o-i passa il -i opzione per ogni mv comando sotto il cofano (vedi sotto). Nel testo sostitutivo, $1 , $2 , ecc, sono i gruppi successivi tra parentesi nel modello. ** significa tutte le (sotto)*directory, ricorsivamente. Il (/) finale non è un gruppo tra parentesi ma un qualificatore glob che significa abbinare solo le directory. ${2:l} converte $2 in minuscolo.

Portatile

A un livello:

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

Il / finale limita la corrispondenza alle directory e mv -i fa chiedere conferma in caso di collisione. Rimuovere il -i per sovrascrivere in caso di collisione e utilizzare yes n | for … . per non essere richiesto e non eseguire alcuna ridenominazione che potrebbe entrare in conflitto.

Ricorsivamente:

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

L'uso di -depth assicura che le directory profondamente nidificate vengano elaborate prima dei loro predecessori. L'elaborazione del nome si basa sulla presenza di un /; se vuoi chiamare opera nella rubrica corrente, usa ./* (adattando lo script della shell per far fronte a . o * è lasciato come esercizio al lettore).

Rinomina Perl

Qui utilizzo lo script di ridenominazione Perl che Debian e Ubuntu forniscono come /usr/bin/prename (di solito disponibile come rename anche). A un livello:

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

Ricorsivamente, con bash ≥4 o zsh:

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

In modo ricorsivo, portatile:

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

Linux
  1. 5 esempi per creare più directory in Linux

  2. Navigazione rapida delle directory in Bash Shell?

  3. Creare forzatamente una directory hard link?

  4. Creazione e rimozione di file e directory in Linux

  5. Elenca in modo ricorsivo tutti i file in una directory, inclusi i file nelle directory dei collegamenti simbolici

Come creare directory in Linux (comando mkdir)

Come rimuovere (eliminare) la directory in Linux

Creazione, eliminazione e gestione di directory su Linux

Come eseguire tutti gli script in una directory in Linux

Simulazione di un collegamento fisico a una directory?

Come scollegare tutti i collegamenti simbolici sotto la directory?