Terminale: rimuovere ricorsivamente l'estensione specifica

1

Ho una cartella, contenente molte altre cartelle.

Alcune delle cartelle in essa contenute (a profondità arbitrarie) hanno un'estensione specifica, diciamo, .ext :

TopFolder
+ Folder1
| + Folder11.ext
|   +Folder111
+ Folder2.ext

Voglio utilizzare Terminal per rimuovere quell'estensione da tutte le cartelle in qualsiasi sottocartella in modo che assomigli a questa:

TopFolder
+ Folder1
| + Folder11
|   +Folder111
+ Folder2

Ho giocato con find e xargs, ma non ho potuto farlo funzionare.

    
posta fzwo 21.10.2015 - 19:29
fonte

2 risposte

1

Prova questo:

$ find TopFolder -print
Topfolder
Topfolder/Folder1
Topfolder/Folder1/Folder11.ext
Topfolder/Folder1/Folder11.ext/Folder111
Topfolder/Folder2.ext
$ find TopFolder -name '*.ext' -print | while read i; do mv -v "$i" "${i%.ext}";done
$ find TopFolder
TopFolder
TopFolder/Folder1
TopFolder/Folder1/Folder11
TopFolder/Folder1/Folder11/Folder111
TopFolder/Folder2

La prima e l'ultima scoperta servono solo per mostrare la gerarchia precedente e successiva. Ecco come funziona il middle find, quello che fa il lavoro vero, funziona:

$ find TopFolder -name '*.ext' -print

Questo trova tutto in TopFolder che corrisponde allo schema '*.ext' , cioè a tutti i file e le directory che terminano in .ext, e stampa il percorso per ognuno. Se vuoi limitare solo le directory, aggiungi -type d .

while read i; do

read i legge dallo standard input nella variabile di shell i . while cicli fino a quando read i restituisce false, cosa che fa su end-of-file. Essendo l'output di find in fase di piping, l'output standard di read è l'output di find , quindi read leggerà una riga alla volta dall'output find finché non ce n'è nessuna sinistra.

mv -v "$i" "${i%.ext}"

Questo è il vero nome. Il -v è lì solo così puoi vedere cosa sta succedendo, puoi lasciarlo fuori se lo desideri. "$i" è l'origine, quotata nel caso in cui qualsiasi elemento del percorso in $i contenga spazi. "${i%.ext}" è la destinazione, che è $i , con qualsiasi percentuale finale rimossa.ext.

done

Questo termina semplicemente il ciclo while.

Nota che questo è in bash, dovrebbe essere fattibile in altre shell abbastanza moderne, ma la sintassi potrebbe essere leggermente diversa.

    
risposta data 21.10.2015 - 19:48
fonte
0

Puoi utilizzare uno script di ricerca e l'espansione dei parametri.

find . -type d -name '*.ext' -exec ksh -c 'for dir
    do mv "$dir" "${dir%.*}"
    done' _ {} +
    
risposta data 21.10.2015 - 19:50
fonte

Leggi altre domande sui tag