2013-05-27 15 views
9

Ich möchte alle Dateien, die in Ordner new-files aus einem anderen Ordner in Linux mit Bash-Befehlen vorhanden sind.Linux Bash - entfernen Sie alle Dateien, die in einem Verzeichnis aus einem anderen Verzeichnis sind

Ich brauche dies für zwei Dinge:

  • ich einige Setup-Skripten bekam die einige vorkonfigurierte Konfigurationsdateien über kopieren. Ich möchte die Möglichkeit haben, diese Dateien wieder
  • Manchmal passiert zu entfernen, dass Archive in die Wurzel Ihrer Downloads Verzeichnis entpackt bekommen und nicht in einem subdir, weil die Person, die die Datei alles root zum Archiv setzen Verpackung

Was ist der beste Weg, das zu tun?

bearbeiten, zu klären:

  1. bekam ich einen Ordner mit new-files genannt Dateien.
  2. Jetzt führe ich cp -r new-files/* other-directory/ aus.
  3. Sagen wir, andere-Verzeichnis ist nicht das Verzeichnis, ich wollte sie kopieren, aber es enthält bereits andere Dateien, so kann ich nicht einfach rm andere-Verzeichnis/* tun.
  4. Ich muss alle Ordner löschen, die ich versehentlich kopiert habe. Wie mache ich das?

Antwort

13

Sie können den folgenden Befehl verwenden:

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

Es werden alle Dateien auf, die in dem aus dem Verzeichnis new-files kopiert (new-files Verzeichnis wird nicht berücksichtigt). Für jede Datei wird die kopierte Version in entfernt.

Aber Sie müssen vorsichtig sein, wenn eine Datei in new-files eine Datei in löschen, können Sie die alte Datei mit dieser Methode nicht wiederherstellen. Sie sollten überlegen, ein Versionierungssystem zu verwenden (wie zum Beispiel Git).

+2

Nice one! Ich würde empfehlen, "-exec" mit dem abschließenden '+' not ';' zu verwenden. Dies ist effektiver, da 'rm' viel seltener aufgerufen wird (ähnlich wie' xargs'). – TrueY

+0

@TrueY Das geht nicht. 'find' löst einen Fehler aus, wenn Sie' + 'verwenden, während' {} 'ein Leerzeichen vorangestellt ist. – aymericbeaumet

+0

Was möchten Sie mit diesem Regex erreichen? Es scheint meinen Befehl zu zerstören, wenn er 'conf.d'-Verzeichnisse und so herausfiltert? – Zulakis

2

wee Skript zu tun, was Sie wollen:

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

echo $x | xargs rm 
+0

ich es wie folgt bedeuten: überprüfen, welche Dateien in 'new-files' enthalten sind und lösche diese (wenn sie existieren) aus einem anderen Verzeichnis – Zulakis

+0

Sorry, wenn es nicht klar war, Englisch ist nicht meine Muttersprache – Zulakis

+0

Ich fügte ein anderes Beispiel zu meinem ursprünglichen Beitrag hinzu, vielleicht hilft das – Zulakis

4

Von Ihrem:

bearbeiten, zu klären:

  1. Ich habe einen Ordner mit Dateien new-files genannt.
  2. Jetzt führe ich cp -r new-files/* other-directory/ aus.
  3. Lets sagen Other-Verzeichnis ist nicht das Verzeichnis Ich wollte sie kopieren, aber es enthält bereits andere Dateien, so kann ich nicht einfach rm Other-Verzeichnis/*.
  4. Ich muss alle Ordner löschen, die ich versehentlich kopiert habe. Wie mache ich das?

Sie können Schleife durch die ursprüngliche dir new-files/ und Löschen von Dateien mit demselben Namen in der other-directory/:

for file in /new-files/* 
do 
    rm /other-directory/"$file" 
done 
Verwandte Themen