2013-05-27 19 views
9

Voglio rimuovere tutti i file esistenti nella cartella new-files da un'altra cartella di Linux usando i comandi di bash.linux bash - rimuove tutti i file che si trovano in una directory da un'altra directory

ho bisogno di questo per due cose:

  • ho ottenuto alcuni script di installazione che copiare alcuni file preconfigurati config sopra. Mi piacerebbe avere la possibilità di rimuovere i file di nuovo
  • A volte capita che gli archivi ottengono scompattato nella root della vostra directory di download e non in una sottocartella perché la persona imballaggio il file messo tutto al archivi radice

Qual è il modo migliore per farlo?

Modifica, per chiarire:

  1. ho avuto una cartella con file chiamati new-files.
  2. Ora eseguo cp -r new-files/* other-directory/.
  3. Diciamo che other-directory non è la directory in cui volevo copiarli ma contiene già altri file quindi non posso semplicemente rm other-directory/*.
  4. Ho bisogno di cancellare tutte le cartelle che ho copiato accidentalmente. Come lo faccio?

risposta

13

è possibile utilizzare il seguente comando:

cd new-files ; find . -exec rm -rf path/to/other-directory/{} \; 

Esso elencherà tutti i file che dove copiati dalla directory new-files (new-files directory non verrà presa in considerazione). Per ogni file, rimuoverà la versione copiata in other-directory.

Ma bisogna stare attenti, se un file in new-files cancella un file in other-directory, non sarà possibile ripristinare il vecchio file utilizzando questo metodo. Si dovrebbe prendere in considerazione l'uso di un sistema di controllo delle versioni (ad esempio Git).

+2

Bello! Consiglierei di usare '-exec' con il trailing' + 'not';'. Questo è più efficace dato che 'rm' ha chiamato molto meno volte (simile a' xargs'). – TrueY

+0

@TrueY Non puoi farlo. 'find' genera un errore se si usa' + 'mentre' {} 'è preceduto da un carattere non spaziale. – aymericbeaumet

+0

Cosa vuoi ottenere con quella regex? Sembra distruggere il mio comando mentre filtra le registri 'conf.d' e così via? – Zulakis

2

sceneggiatura wee di fare ciò che si vuole:

pushd `pwd` 
cd /path/to/new-files 
x=`find . -type f` 
popd 

echo $x | xargs rm 
+0

voglio dire in questo modo: verificare quali file sono contenuti in 'new-files' e cancella questi (se esistono) da un'altra directory – Zulakis

+0

Scusa se non era chiaro, l'inglese non è la mia lingua madre – Zulakis

+0

Ho aggiunto un altro esempio al mio post iniziale, forse questo aiuta – Zulakis

4

Dal:

Modifica, per chiarire:

  1. ho avuto una cartella con file chiamati new-files.
  2. Ora eseguo cp -r new-files/* other-directory/.
  3. Diciamo che other-directory non è la directory in cui volevo copiarli ma contiene già altri file quindi non posso semplicemente fare rm other-directory/*.
  4. Ho bisogno di cancellare tutte le cartelle che ho copiato accidentalmente. Come lo faccio?

È possibile scorrere l'dir originale new-files/ ed eliminare i file con lo stesso nome nel other-directory/:

for file in /new-files/* 
do 
    rm /other-directory/"$file" 
done 
Problemi correlati