Prepara i nomi delle cartelle al nome del file e appiattisce la struttura del file

4

Ho un sacco di cartelle con vari nomi, ad esempio

2013-02   Snow and birds
    PICT0001.jpg
    PICT0002.jpg
2013-06   Bicycle trip
    edited_panorama.jpg
    From phone
        DCIM0001.jpg
        DCIM0002.jpg
        DCIM0003.jpg
    From camera
        DSLR
            PICT0001.raw
            PICT0002.raw
        Compact
            S0000001.jpg           

Come puoi vedere, la struttura generale è un livello variabile di sottocartelle nidificate contenenti immagini. Quello che voglio fare è appiattire la struttura, aggiungendo il nome di ciascun livello di sottocartelle al nome file, come questo:

2013-02   Snow and birds_PICT0001.jpg
2013-02   Snow and birds_PICT0002.jpg
2013-06   Bicycle trip_edited_panorama.jpg
2013-06   Bicycle trip_From phone_DCIM0001.jpg
2013-06   Bicycle trip_From phone_DCIM0002.jpg
2013-06   Bicycle trip_From phone_DCIM0003.jpg
2013-06   Bicycle trip_From camera_DSLR_PICT0001.raw
2013-06   Bicycle trip_From camera_DSLR_PICT0002.raw
2013-06   Bicycle trip_From camera_Compact_S0000001.jpg

Come si può ottenere utilizzando uno script Terminal o qualsiasi altro tipo di script? Ho trovato alcune soluzioni simili, ma sembrano tutte contare su un livello fisso di sottocartelle, mentre la mia struttura delle cartelle è variabile.

    
posta Magnus W 05.04.2018 - 06:08
fonte

2 risposte

3

Ingannevole, soprattutto se vuoi mantenere tutti gli spazi ecc. Esegui quanto segue nella directory in alto (quella che contiene 2013-02 Snow and birds ecc.):

find . -type f -exec sh -c 'for f do x=${f#./}; echo mv "$x" "${x////_}"; done' {} +

L'assegnazione a x elimina il% co_de iniziale da ./ , il find sostituisce tutte le occorrenze (rimanenti) di ${x////_} con / .

Inoltre, ho protetto il _ effettivo con un mv in modo da poter verificare prima se i comandi sembrano ok.

    
risposta data 05.04.2018 - 19:56
fonte
-1

Per gli scopi di questo script, avevo tutte le tue cartelle contenute in una cartella chiamata "Filez" sul mio desktop. Questo script inizia con una finestra di dialogo "scegli cartella" per scegliere la cartella contenente in cui le cartelle "2013-06 Bicycle trip" & "2013-02 Neve e uccelli" risiedono. Ciò restituirà tutti i singoli file all'interno di tutte le cartelle e sottocartelle, di cui si desidera modificare i nomi.

set mainFolder to choose folder
set posixPathOfMainFolder to POSIX path of mainFolder
tell application "Finder"
    set theNames to files of entire contents of mainFolder as alias list
end tell
set newFileNames to {}
repeat with aFile in theNames
    set text item delimiters to {posixPathOfMainFolder, "/"}
    set aFile to POSIX path of aFile
    set tempName to text items -1 thru 2 of aFile
    set text item delimiters to "_"
    set end of newFileNames to tempName as text
    set text item delimiters to ""
    tell application "Finder"
        set the name of (aFile as POSIX file as alias) to last item of newFileNames as text
    end tell
end repeat
tell application "Finder"
    set theNames to files of entire contents of mainFolder as alias list
    move theNames to mainFolder
    delete folders of mainFolder
end tell

    
risposta data 13.04.2018 - 05:15
fonte

Leggi altre domande sui tag