Preponer los nombres de las carpetas al nombre del archivo y aplanar la estructura del archivo

4

Tengo un montón de carpetas con varios nombres, por ejemplo

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           

Como puede ver, la estructura general es un nivel variable de subcarpetas anidadas que contienen imágenes. Lo que quiero hacer es aplanar la estructura, agregando el nombre de cada nivel de subcarpetas al nombre de archivo, de esta manera:

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

¿Cómo se puede lograr esto utilizando un script de Terminal o cualquier otro tipo de script? He encontrado algunas soluciones similares, pero todas parecen depender de un nivel fijo de subcarpetas, mientras que la estructura de mi carpeta varía.

    
pregunta Magnus W 05.04.2018 - 06:08

2 respuestas

3

Una difícil, especialmente si desea mantener todos los espacios, etc. Ejecute lo siguiente en el directorio superior (el que contiene 2013-02 Snow and birds , etc.):

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

La asignación a x elimina el ./ inicial de find , el ${x////_} reemplaza todas las ocurrencias (restantes) de / con _ .

Además, he protegido el mv real con un echo para que pueda verificar primero si los comandos se ven bien.

    
respondido por el nohillside 05.04.2018 - 19:56
-1

Para los fines de este script, tenía todas sus carpetas contenidas en una carpeta llamada "Filez" en mi escritorio. Este script comienza con un cuadro de diálogo "elegir carpeta" para elegir la carpeta que contiene las carpetas "Viaje en bicicleta 2013-06" & "2013-02 Nieve y pájaros" residen. Esto devolverá todos los archivos individuales dentro de todas las carpetas y subcarpetas, de las cuales desea que se cambien los nombres.

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

    
respondido por el wch1zpink 13.04.2018 - 05:15

Lea otras preguntas en las etiquetas