1 votos

¿Cómo puedo identificar y ordenar grupos de líneas de texto separadas por una línea en blanco?

Estoy clasificando un gran número de ficheros de imágenes archivadas en los que algunos están duplicados, y quiero eliminar los duplicados. Utilizo el siguiente shell script para obtener una lista de duplicados.

fdupes -r -A /Users/yves/Pictures >> "/Users/yves/Desktop/Dupes-new-$(date +%Y-%m-%-d-%Hh%M).txt"

Sin embargo, hay algunos casos en los que el número de ficheros duplicados es superior a 2, como 3 o más, como se muestra a continuación:

/Volumes/Archives-photos-new/Fichiers-RAW/_NIK_*2702.NEF
/Volumes/Archives-photos-new/Fichiers-RAW/_NIK_2702 2.NEF
/Volumes/Archives-photos-new/Fichiers-RAW/_NIK_2702.NEF
/Volumes/Archives-photos-new/Fichiers-RAW/_NIK2702.NEF

/Volumes/Archives-photos-new/Fichiers-RAW/_NIK_FF1629 2.NEF
/Volumes/Archives-photos-new/Fichiers-RAW/_NIK_FF1629.NEF
/Volumes/Archives-photos-new/Fichiers-RAW/DSC_1629.NEF

Cuando el número de duplicados es consistentemente exactamente 2, he utilizado un comando awk para recuperar la primera línea de cada grupo: awk '{if(NR%3==1) print $0}' filepath > result y he creado un archivo "TO-DELETE". Y luego he eliminado los archivos identificados en el archivo mediante el siguiente AppleScript script:

set srcFile to ((path to desktop) as text) & "TO-DELETE.txt"

set lns to paragraphs of (read file srcFile as «class utf8»)
repeat with i from 1 to count lns
    if (item i of lns) is not in {missing value, ""} then
        set f to POSIX file (item i of lns)
        tell application "Finder"
            try
                move f to trash
            on error
                display dialog "Error with file" & space & (item i of lns as string)
            end try
        end tell
    end if
end repeat

Pero no veo un camino fácil y fiable para gestionar los duplicados cuyo número es superior a 2. Ahora tengo varios miles de archivos duplicados, y por lo tanto la edición manual no es una opción. ¿Alguna sugerencia y ayuda?

3voto

fdupes puede eliminar los duplicados automáticamente:

fdupes -r -A -D --noprompt --delete /Users/yves/Pictures

Omita el --noprompt si desea confirmar primero que funciona como se espera.

Si no te fías del todo, también puedes utilizar fdupes -r -A --omitfirst /Users/yves/Pictures >> ~/TO-DELETE.txt para listar todos los duplicados encontrados sin el primero .

0voto

Mockman Puntos 16

Asumiendo un texto que se parece a esto, el script de abajo borraría cada archivo después del primero de cada grupo. Así que en este ejemplo, cuatro archivos se conservarían, siete se tirarían a la basura.

/Volumes/Archives-photos-new/Fichiers-RAW/_NIK_*2702.NEF
/Volumes/Archives-photos-new/Fichiers-RAW/_NIK_2702 2.NEF
/Volumes/Archives-photos-new/Fichiers-RAW/_NIK_2702.NEF
/Volumes/Archives-photos-new/Fichiers-RAW/_NIK2702.NEF

/Volumes/Archives-photos-new/Fichiers-RAW/_NIK_FF4629.NEF
/Volumes/Archives-photos-new/Fichiers-RAW/DSC_4629.NEF

/Volumes/Archives-photos-new/Fichiers-RAW/_NIK_FF1629 2.NEF
/Volumes/Archives-photos-new/Fichiers-RAW/_NIK_FF1629.NEF
/Volumes/Archives-photos-new/Fichiers-RAW/DSC_1629.NEF

/Volumes/Archives-photos-new/Fichiers-RAW/_NIK_3702 2.NEF
/Volumes/Archives-photos-new/Fichiers-RAW/_NIK_3702.NEF

Sin espacios al final de las líneas; línea vacía entre cada grupo de duplicados;

Lo que hace es dividir el texto en los párrafos dobles y crear una lista de grupos de rutas de archivo: cuatro en este ejemplo. A continuación, recorre cada grupo y coloca el primer elemento en la carpeta guarda (opcional) y el resto en la lista pierde lista. Cada tipo de acción se registra para poder seguir el destino de los archivos, pero este registro se puede omitir.

Tenga en cuenta que el pierde lista no es plana. Contendrá cuatro listas, cada una de las cuales contendrá el número de ficheros que haya que borrar.

A continuación, recorre cada lote de archivos en pierde y luego a través de cada archivo en cada lote, convirtiendo cada ruta posix a una url de archivo para que el buscador la mueva a la papelera.

Si la prueba se realiza correctamente, puede cambiar el principio de modo que dupeList se convierte en la lista de ficheros de tu fichero 'TO-DELETE.txt'. Si por alguna razón, es imperativo que usted mantenga el último archivo en cada grupo, entonces usted podría simplemente invertir cada lista antes de que se ejecute el comando resto del texto operación.

set dupeList to "/Volumes/Archives-photos-new/Fichiers-RAW/_NIK_*2702.NEF
/Volumes/Archives-photos-new/Fichiers-RAW/_NIK_2702 2.NEF
/Volumes/Archives-photos-new/Fichiers-RAW/_NIK_2702.NEF
/Volumes/Archives-photos-new/Fichiers-RAW/_NIK2702.NEF

/Volumes/Archives-photos-new/Fichiers-RAW/_NIK_FF4629.NEF
/Volumes/Archives-photos-new/Fichiers-RAW/DSC_4629.NEF

/Volumes/Archives-photos-new/Fichiers-RAW/_NIK_FF1629 2.NEF
/Volumes/Archives-photos-new/Fichiers-RAW/_NIK_FF1629.NEF
/Volumes/Archives-photos-new/Fichiers-RAW/DSC_1629.NEF

/Volumes/Archives-photos-new/Fichiers-RAW/_NIK_3702 2.NEF
/Volumes/Archives-photos-new/Fichiers-RAW/_NIK_3702.NEF"

set AppleScript's text item delimiters to (linefeed & linefeed)
set fileClumps to text items of dupeList -- each clump of files between empty lines

set keeps to {} -- files to keep
set loses to {} -- files to trash
set AppleScript's text item delimiters to linefeed
repeat with x from 1 to count fileClumps
    set end of keeps to first text item of contents of item x of fileClumps
    log keeps -- optional
    set end of loses to rest of text items of contents of item x of fileClumps
    log loses -- optional
end repeat

repeat with y in loses -- every batch of files to trash
    repeat with z in y -- each file in the batch
        set w to POSIX file (contents of z) -- each file as «class furl»
        tell application "Finder"
            try
                move w to trash
            on error
                display dialog "Error with file" & space & w
            end try
        end tell
    end repeat
end repeat

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X