Sottrai i file nella cartella A dalla cartella B

2

Ho la cartella A con 8000 immagini e la cartella B con 9000 immagini. La cartella B contiene le 8000 immagini dalla cartella A e altre 1000 immagini. Vorrei eliminare le 8000 immagini che sono già nella cartella A, lasciando solo le "nuove" 1000 immagini.

Qualcuno sa un modo elegante per fare il lavoro? (btw Non posso ordinarli per data e ottenere quelli più recenti)

    
posta b101 13.09.2017 - 14:33
fonte

4 risposte

2

Puoi usare un semplice script bash per fare questo ::

for file in *.*; do if [ -f "/FolderA/${file}" ]; then rm "/FolderB/$file"; fi; done;

Questo script presuppone che tu sia già in FolderB, che è dove vuoi eliminare i file già esistenti in FolderA.

Puoi modificarlo se conosci l'estensione dei file immagine (ad esempio, .png, .gif, ecc.) e hai i nomi esatti delle cartelle. Pertanto, anziché *.* puoi utilizzare *.png o *.gif .

Una versione MOLTO più sicura:

for file in *.*; do if [ -f "/FolderA/${file}" ]; then mv "/FolderB/$file" ~/.Trash; fi; done;

Questo sposta il file nel Cestino. L'utilizzo di rm è una strada a senso unico. Dopo aver premuto invio su un comando rm , è fatto; quel file è sparito per sempre. Sposta nel cestino per assicurarti di ottenere i risultati che stai cercando.

    
risposta data 13.09.2017 - 15:17
fonte
1

Se hai installato GNU findutils tramite homebrew, puoi cd a folderB nel terminale e inserire

echo rm $(find /path/to/folderA -type f -printf "%P\n")

Controlla l'output. Se elenca i file che si desidera eliminare, ripetere senza echo per rimuovere effettivamente i file.

Il find predefinito del sistema non ha -printf , ma la scrittura

echo rm $(find /path/to/folderA -type f -execdir {} \; )

(emesso anche da folderB !) dovrebbe fare lo stesso lavoro (non posso testarlo qui).

    
risposta data 13.09.2017 - 15:02
fonte
1
  • Crea un duplicato della cartella A: A-copy.
  • Apri terminale e inserisci touch -mt 200001010000 /path/to/A-copy/*.*
  • Spostare i file da A (copia) a B e sostituire i file esistenti lì.
  • Ordina i file nella cartella B per data di modifica.
  • Rimuovi tutti i file con la data del 1 gennaio 2000 nella cartella B

Questo non modificherà le date di modifica dei file originali nella cartella a.

Se la cartella A contiene già file con data di modifica del 1 ° gennaio 2000, scegli un'altra data nel passaggio 2.

    
risposta data 13.09.2017 - 15:07
fonte
-1

Se la cartella B ha tutte le immagini dalla cartella A più un ulteriore 1000, quindi elimina semplicemente la cartella A!

Semplici!

Tuttavia, se la cartella B ha 9000 immagini e la cartella A ha 9000 immagini ma c'è una disparità tra di esse quella cartella B non ha tutte le immagini della cartella A quindi usa diff per trovare la differenza.

Detto questo, questa sarà solo una differenza di nome file. Potresti avere due immagini che condividono lo stesso nome, che è un problema completamente diverso!

Il codice:

diff -rq folder1 folder2

The r tells diff to look at each directory recursively, including subdirectories. The q switch sets diff brief mode. If we didn’t set brief mode, diff would not only tell you which files are different between the two folders, but also show the actual line-by-line differences for any text files that exist in both locations but are not identical.

    
risposta data 13.09.2017 - 14:59
fonte

Leggi altre domande sui tag