Spostare i file nella posizione appropriata in base alla loro estensione
-
28-10-2019 - |
Domanda
Ho uno script di pulizia che sposta i file in base alla loro estensione in posizioni preimpostate appropriate.
Ad esempio, un file con l'estensione .xls verrà spostato nella cartella ~ xls, .sql a ~ sql e così via. Ecco la mia sceneggiatura.
$dirtyfolder = "\\server\c$\Documents and Settings\user\Desktop\"
$org = "\\BACKUPS\users\"
dir $dirtyfolder -fil *.doc | mv -dest "$($org)ORG\doc"
dir $dirtyfolder -fil *.txt | mv -dest "$($org)ORG\txt"
dir $dirtyfolder -fil *.sql | mv -dest "$($org)ORG\sql"
dir $dirtyfolder -fil *.log | mv -dest "$($org)ORG\log"
dir $dirtyfolder -fil *.zip | mv -dest "$($org)ORG\zip"
dir $dirtyfolder -fil *.7z | mv -dest "$($org)ORG\zip"
dir $dirtyfolder -fil *.png | mv -dest "$($org)ORG\img"
dir $dirtyfolder -fil *.jpg | mv -dest "$($org)ORG\img"
dir $dirtyfolder -fil *.mp3 | mv -dest "$($org)ORG\mp3"
Sono pienamente consapevole che questo in un modo inelegante per raggiungere il mio obiettivo. Quindi vorrei sapere come posso modificare lo script in modo che posso
- riutilizzare il codice ripetitivo
- Se la cartella di destinazione non esiste, dovrebbe essere creata.
- Gruppo estensioni simili, come PNG e JPG
Soluzione
Testato. Una soluzione (non-ricorsiva) che non gestisce il raggruppamento:
ls $dirtyfolder/* | ? {!$_.PSIsContainer} | %{ $dest = "$($org)ORG\$($_.extension)" if (! (Test-Path -path $dest ) ) { new-item $dest -type directory } mv -path $_.fullname -destination $dest }
Soluzione con il raggruppamento:
ls $dirtyfolder/* | ? {!$_.PSIsContainer} | %{ $dest = "$($org)ORG\$(get-destbytype $_.extension)" if (! (Test-Path -path $dest ) ) { new-item $dest -type directory } mv -path $_.fullname -destination $dest }
dove get-destbytype
è la seguente funzione:
function get-destbytype($ext) { Switch ($ext) { {$ext -match '(jpg|png|gif)'} { "images" } {$ext -match '(sql|ps1)'} { "scripts" } default {"$ext" } } }
Altri suggerimenti
Questo è il mio test di lavoro
$source = "e:\source"
$dest = "e:\dest"
$file = gci $source | ? {-not $_.psiscontainer}
$file | group -property extension |
% {if(!(test-path(join-path $dest -child $_.name.replace('.','')))) { new-item -type directory $(join-path $dest -child $_.name.replace('.','')).toupper() }}
$file | % { move-item $_.fullname -destination $(join-path $dest -child $_.extension.replace(".",""))}
Lo script troverà tutte le diverse estensioni nella cartella di origine. Per ogni estensione, se la cartella non esiste già all'interno della destinazione, verrà creata. L'ultima riga si avvicinerà a ciascun file dalla sorgente e lo sposterà nella destinazione della sottocartella destra.
Se si desidera inserire immagini con estensioni diverse nella stessa cartella necessaria per effettuare un ulteriore controllo, utilizzando un'istruzione IF o Switch.