[Risolto] [Bash] Spostare ricorsivamente file in una sottocartella
[Risolto] [Bash] Spostare ricorsivamente file in una sottocartella
lo so che esistono molto filoni simili, ma non ho trovato la soluzione al mio problema.
La situazione è la seguente; in una cartella-madre ho questa ramificazione
CartellaA
----N file PDF
----Sottocartella
Cartella B
----N file PDF
----Sottocartella
Le sottocartelle si chiamano sempre allo stesso modo; vorrei spostare ricorsivamente i file PDF nella "Sottocartella" relativa, che si trova allo stesso livello dei file pdf.
Idealmente questo sistema dovrebbe poter funzionare anche con CMDER sotto Windows.
Grazie in anticipo e a presto,
Matteo
-
- Scoppiettante Seguace
- Messaggi: 371
- Iscrizione: venerdì 10 dicembre 2021, 18:33
- Desktop: fvwm
- Distribuzione: (X)Ubuntu20@home; openSUSE42.3@work
- Sesso: Maschile
- Località: Paneropoli
Re: [Bash] Spostare ricorsivamente file in una sottocartella
Codice: Seleziona tutto
ls *
dirA:
due.pdf Pippo/ tre.pdf uno.pdf
dirB:
111.pdf 222.pdf 333.pdf Pippo/
Codice: Seleziona tutto
mv dirA/*pdf dirA/Pippo
mv dirB/*.pdf dirB/Pippo
Codice: Seleziona tutto
ls */*
dirA/Pippo:
due.pdf tre.pdf uno.pdf
dirB/Pippo:
111.pdf 222.pdf 333.pdf
- vaeVictis
- Imperturbabile Insigne
- Messaggi: 4703
- Iscrizione: venerdì 27 luglio 2012, 17:58
- Desktop: Gnome
- Distribuzione: Ubuntu 20.04 64bit
Re: [Bash] Spostare ricorsivamente file in una sottocartella
Io procederei come segue, che è un modo un po' più generico rispetto allo spostamento a mano del contenuto di ogni singola cartella.
Creo la tua struttura in un directory Prova, con questi comandi
Codice: Seleziona tutto
$ mkdir -p Prova/Dir{A,B,C,D,E}/Sottocartella
$ touch Prova/Dir{A,B,C,D,E}/file{1,2,3,4,5,6,7,8}.pdf
Codice: Seleziona tutto
$ motherDir=./Prova
$ destDir=Sottocartella
$ find "$motherDir" -mindepth 2 -maxdepth 2 -type f -iname "*pdf" | while read filePath; do fileName=$(basename "$filePath") && dirPath=$(dirname "$filePath" ) && mv "$filePath" "$dirPath"/"$destDir"/"$fileName" ; done
Al posto di destDir puoi mettere il nome della tua directory in cui vuoi spostare tutto, che nel tuo esempio hai chiamato Sottocartella.
Spiegazione del comando:
Codice: Seleziona tutto
find "$motherDir" -mindepth 2 -maxdepth 2 -type f -iname "*pdf"
Poi in pipe c'è questo ciclo while:
Codice: Seleziona tutto
while read filePath; do fileName=$(basename "$filePath") && dirPath=$(dirname "$filePath" ) && mv "$filePath" "$dirPath"/"$destDir"/"$fileName" ; done
1) assegna a fileName il nome del file
Codice: Seleziona tutto
fileName=$(basename "$filePath")
2) assegna a dirPath il path della directory che contiene il file
Codice: Seleziona tutto
dirPath=$(dirname "$filePath" )
3) con il comando
Codice: Seleziona tutto
mv "$filePath" "$dirPath"/"$destDir"/"$fileName"
Se vuoi invece evitare la dipendenza da dirname e basename, puoi cambiare il ciclo while in
Codice: Seleziona tutto
while read filePath; do mv "$filePath" "${filePath%/*}"/"$destDir"/"${filePath##*/}"
Queste due particolari manipolazioni delle stringhe funzionano così:
con
Codice: Seleziona tutto
$ filePath=./Cartella/SottoCartella/file.txt
Codice: Seleziona tutto
$ echo "${filePath%/*}"
./Cartella/SottoCartella
Codice: Seleziona tutto
echo "${filePath##*/}"
file.txt
Codice: Seleziona tutto
${string%substring}
Quindi, come usata sopra, substring è uguale a /*
In questo modo ti leva tutto a partire da destra fino alla prima /, e quindi ti lascia la directory che contiene il file.
La seconda è
Codice: Seleziona tutto
${string##substring}
Quindi, come usato sopra, substring è uguale a */
In questo modo ti leva tutto a partire da sinistra e fino all'ultimo /, lasciando quindi solo il nome del file.
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Re: [Bash] Spostare ricorsivamente file in una sottocartella
A presto,
Matteo
- vaeVictis
- Imperturbabile Insigne
- Messaggi: 4703
- Iscrizione: venerdì 27 luglio 2012, 17:58
- Desktop: Gnome
- Distribuzione: Ubuntu 20.04 64bit
Re: [Bash] Spostare ricorsivamente file in una sottocartella
Figurati.
Una sola osservazione. Nel titolo va scritto [Risolto], non "risolto-".
Ciao.
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Re: [Risolto] [Bash] Spostare ricorsivamente file in una sottocartella
M.F.
Chi c’è in linea
Visualizzano questa sezione: 0 utenti iscritti e 21 ospiti