Wie entferne ich ein Verzeichnis, ohne dessen Inhalt zu entfernen?

7

Nehmen wir an, ich habe ein Verzeichnis /home/smit/test. Darin habe ich viele Unterverzeichnisse und Dateien. Ich möchte nur das Verzeichnis /home/smit/test und nicht seinen inneren Inhalt entfernen , damit Dateien und Unterverzeichnisse von /home/smit/testautomatisch in das Verzeichnis aufgenommen werden /home/smit/.

In einem realen Fall habe ich auch ein /usr/share/backgrounds/all/Verzeichnis mit vielen Unterverzeichnissen. und diese Unterverzeichnisse haben viele Bilder. Ich möchte alle Unterverzeichnisse entfernen, damit deren Inhalt in enthalten ist /usr/share/backgrounds/all/. Ich kann dies mit GUI tun, aber ich möchte es auf coole Weise per Terminal tun. Wie kann ich es tun?

Niemand
quelle

Antworten:

16

In diesen Situationen besteht die Gefahr, dass Dateien mit demselben Namen überschrieben werden. Wie von @Arronical erwähnt, können Sie dies vermeiden, indem Sie das -bFlag verwenden, durch mvdas alle gleichnamigen Dateien unterschieden werden, indem Sie sie ~an ihre Namen anhängen . Wenn jedoch drei oder mehr Dateien mit demselben Namen vorhanden sind, werden nur die erste und die letzte Datei gespeichert. Überprüfen Sie daher den Inhalt, bevor Sie ihn verschieben, um Ihre Dateien zu schützen.

Der erste einfache Fall ist einfach; Wir können einen Shell Glob verwenden. Dadurch werden jedoch keine versteckten Dateien verschoben. Wenn Sie also Dateinamen haben, die mit .beginnen, schalten Sie diese zunächst eindotglob

shopt -s dotglob

Dann können Sie ausführen:

mv -b /home/smit/test/* /home/smit
rmdir /home/smit/test

Deaktivieren Sie, dotglobwenn Sie möchten (es wird ohnehin auf die Standardeinstellungen zurückgesetzt, wenn Sie eine neue Shell öffnen):

shopt -u dotglob

Für den zweiten (realen) Fall verwenden wir find, der standardmäßig versteckte Dateien verschiebt:

Stellen Sie sicher, dass Sie sich zuerst am richtigen Ort befinden.

cd /usr/share/background/all
find -type f -exec echo mv -vb -- {} . \;

Wenn das gut aussieht, führen Sie es aus, ohne echoDateien tatsächlich zu verschieben

find -type f -exec mv -vb -- {} . \;

Dann finden Sie die Verzeichnisse

find -type d

Wenn Sie sehen, was Sie entfernen möchten:

find -type d -delete

Dies ist sicher, da es sich weigert, Verzeichnisse zu entfernen, die noch Inhalt enthalten.

Zanna
quelle
3
Sie können auch die Optionen -boder verwenden , um mit doppelten Dateinamen umzugehen und Backups der Originalversionen zu erstellen. --backupmv
Arronical
1
Danke. Jetzt bin ich cooler. Aber ich muss noch einen Blick auf die Manpage von find werfen, um cooler zu werden
:)
Andere Unterverzeichnisse sind weg, aber das Linuxmint-Verzeichnis wird nicht gelöscht. Es sagt Folgendes: - find: cannot delete ‘./linuxmint’: Directory not emptyAber andere Dateien waren auch nicht leer. Ich habe keine Informationen in der Manpage gefunden. Es enthält Dateien, default_background.jpgdie ich nicht einmal über die GUI öffnen kann.
niemand
1
@SMITPATIL Die Verzeichnisse sollten alle durch den Verschiebevorgang geleert worden sein. Ich gehe davon aus, dass Sie tatsächlich ausgeführt werden mussten find -type f -exec sudo mv -vb -- {} . \;(da mvAktionen Schreibvorgänge sind), aber wenn nicht, gab es Berechtigungsfehler? Möchten Sie einen Chatraum einrichten, um herauszufinden, was gerade passiert?
Zanna
1
In diesem Fall wäre das find SOURCE -type f -exec mv -bt TARGET -- {} + && rm -rf SOURCE.
David Foerster