Ausschließlich die Verzeichnisstruktur kopieren, ohne beinhaltete Dateien, geht das?
Ausschließlich die Verzeichnisstruktur kopieren, ohne beinhaltete Dateien, geht das?
Hallo Forum,
manchmal würde ich gerne eine vorhandene Verzeichnisstruktur als Muster copieren. Deren Inhalt mit zu kopieren und danach manuel zu löschen ist sehr aufwendig bei großeren Strukturen. Dazu zwei fragen:
1. Gibt es einen Befehl, mit dem man ausschließlich die Verzeichnisse (Unterverzeichnisse inklusiv), jedoch ohne deren Dateien copieren kann?
2. Gibt es einen Befehl, mit dem alle Dateien einer Verzeichnisstruktur gelöscht werden können?
Vielen Dank!
Viele Grüße
dengo
manchmal würde ich gerne eine vorhandene Verzeichnisstruktur als Muster copieren. Deren Inhalt mit zu kopieren und danach manuel zu löschen ist sehr aufwendig bei großeren Strukturen. Dazu zwei fragen:
1. Gibt es einen Befehl, mit dem man ausschließlich die Verzeichnisse (Unterverzeichnisse inklusiv), jedoch ohne deren Dateien copieren kann?
2. Gibt es einen Befehl, mit dem alle Dateien einer Verzeichnisstruktur gelöscht werden können?
Vielen Dank!
Viele Grüße
dengo
Re: Ausschließlich die Verzeichnisstruktur kopieren, ohne beinhaltete Dateien, geht das?
Mit `find -type d' kannst du dir alle Verzeichnisse ausgeben lassen. Dann kann man die auch irgendwie kopieren. Hast du online schon mal gesucht. Das Problem scheint mir generisch genug zu sein, dass es dafuer fertige Einzeiler im Web gibt.
Edit: Zur zweiten Frage: Das geht einfach mit `find xxx -type f -delete' oder einem aehnlichen Befehl.
Edit: Zur zweiten Frage: Das geht einfach mit `find xxx -type f -delete' oder einem aehnlichen Befehl.
Use ed once in a while!
Re: Ausschließlich die Verzeichnisstruktur kopieren, ohne beinhaltete Dateien, geht das?
Mit einem --delete am Ende wäre das schon die Antwort auf die zweite Frage

Edit: Meillo war mit seinem Edit schneller.
Manchmal bekannt als Just (another) Terminal Hacker.
Re: Ausschließlich die Verzeichnisstruktur kopieren, ohne beinhaltete Dateien, geht das?
Nee, schneller war ich nicht, er wird nur weiter oben angezeigt.

Du hast fast recht. Bloss muss man `d' durch `f' ersetzen. Dann kann man mit `cp -r' kopieren und danach mit `find -type f -delete' loeschen ... als Workaround statt nur die Verzeichnisstruktur zu kopieren.
Aber sicherlich gibt es auch tolle Einzeiler, die das Kopieren erledigen. Ich denke mir das in etwa so (ungetestet!):
Code: Alles auswählen
find . -type d -exec mkdir -p /path/to/zielverzeichnis/{} \;
Use ed once in a while!
Re: Ausschließlich die Verzeichnisstruktur kopieren, ohne beinhaltete Dateien, geht das?
Ähm, ja selbstverständlich. Da hab ich wohl nur halb gelesen, was du geschrieben hastMeillo hat geschrieben:14.03.2023 14:28:32Du hast fast recht. Bloss muss man `d' durch `f' ersetzen.

Manchmal bekannt als Just (another) Terminal Hacker.
Re: Ausschließlich die Verzeichnisstruktur kopieren, ohne beinhaltete Dateien, geht das?
Man kann wohl auch rsync verwenden. Nicht selbst probiert aber vielleicht mag es jemand ausprobieren.
https://phoenixnap.com/kb/rsync-command-linux-examples hat geschrieben:17. Copy Directory Structure but Skip Files
Rsync allows you to transfer only directory structure if you do not need the files at another location.
To do so, add -f"+ */" -f"- *" before the source directory.
For example, to copy the structure of the Linux directory to Documents, enter:
rsync -av -f"+ */" -f"- *" /home/test/Desktop/Linux /home/test/Documents
Re: Ausschließlich die Verzeichnisstruktur kopieren, ohne beinhaltete Dateien, geht das?
Sowas ähnliches wollte ich auch gerade schreiben. Es geht noch kürzer:uname hat geschrieben:14.03.2023 15:20:06To do so, add -f"+ */" -f"- *" before the source directory.
Code: Alles auswählen
rsync -af "-! */" QUELLE/ ZIEL/
Re: Ausschließlich die Verzeichnisstruktur kopieren, ohne beinhaltete Dateien, geht das?
Ich musste ein bisschen in der Manpage stoebern, bis ich verstanden habe, was das bedeutet. Das exakte Beispiel wird dort erwaehnt, aber ich wollte die Struktur der Filter-Rules verstehen.hikaru hat geschrieben:14.03.2023 15:24:41Sowas ähnliches wollte ich auch gerade schreiben. Es geht noch kürzer:uname hat geschrieben:14.03.2023 15:20:06To do so, add -f"+ */" -f"- *" before the source directory.Code: Alles auswählen
rsync -af "-! */" QUELLE/ ZIEL/
Das Minus zu beginn sagt, dass das folgende ausgeschlossen werden soll. Das Ausrufezeichen negiert das folgende Pattern. Das Pattern (`*/') steht fuer alle Verzeichnisse. Damit wird ausgeschlossen was kein Verzeichnis ist.
Die ausfuehrlichere Version von uname macht das in zwei Schritten: zuerst werden alle Verzeichnisse eingeschlossen und dann alle (restlichen) Dateien ausgeschlossen.
Interessant, mit Filter-Rules habe ich mich bei rsync noch nie beschaeftigt.
Btw: Waere im konkreten Usecase nicht `rsync -r' angemessener als `rsync -a'? Ich faende es eher falsch wenn die Timestamps und Owner mit kopiert werden.
Use ed once in a while!
Re: Ausschließlich die Verzeichnisstruktur kopieren, ohne beinhaltete Dateien, geht das?
Ich mich bis heute auch nicht. Ich wende zwar an ein paar Stellen --exclude-Pattern an (welche ein Spezialfall von Filter-Rules sind) und kam so auf die Idee, dass das gehen könnte, aber so weit hatte ich in der Manpage noch nicht runtergescrollt.Meillo hat geschrieben:14.03.2023 15:40:29Interessant, mit Filter-Rules habe ich mich bei rsync noch nie beschaeftigt.

Ob man die Metadaten braucht/haben will ist natürlich Ansichtssache. So lange sie nicht stören (weil man z.B. auf ein inkompatibles Dateisystem kopiert) sehe ich aber keinen Grund sie nicht zu übertragen, wenn man sie kriegen kann.Meillo hat geschrieben:14.03.2023 15:40:29Btw: Waere im konkreten Usecase nicht `rsync -r' angemessener als `rsync -a'? Ich faende es eher falsch wenn die Timestamps und Owner mit kopiert werden.
Mir ging es allerdings um den rein konzeptuellen Aspekt, dass ein mkdir kein Kopieren ist, auch wenn es hier faktisch das gleiche Ergebnis erzeugt wie ein cp.*
*) offtopic:
mkdir ist ja von der Bedienung her für Verzeichnisse das, was für reguläre Dateien touch ist. Nach dem Konzept "alles ist eine Datei" sollte also auch das gehen um Verzeichnisse anzulegen:
Code: Alles auswählen
$ touch a/
touch: setting times of 'a/': No such file or directory
Re: Ausschließlich die Verzeichnisstruktur kopieren, ohne beinhaltete Dateien, geht das?
Kommt natuerlich darauf an, was man haben will. Ich dachte mir, dass ich eine generische Verzeichnisstruktur immer wieder brauche und dann jeweils unterschiedlich fuelle. In dem Fall waere es mir wichtig, dass ich dann spaeter sehen kann, wann sie wer angelegt oder veraendert hat. Darum haette ich die Metadaten gerne so wie wenn ich sie von Hand neu angelegt haette. Aber das kann in anderen Usecases natuerlich anders sein. Kann man sich dann ja aussuchen.hikaru hat geschrieben:14.03.2023 16:22:36Ob man die Metadaten braucht/haben will ist natürlich Ansichtssache. So lange sie nicht stören (weil man z.B. auf ein inkompatibles Dateisystem kopiert) sehe ich aber keinen Grund sie nicht zu übertragen, wenn man sie kriegen kann.Meillo hat geschrieben:14.03.2023 15:40:29Btw: Waere im konkreten Usecase nicht `rsync -r' angemessener als `rsync -a'? Ich faende es eher falsch wenn die Timestamps und Owner mit kopiert werden.
hikaru hat geschrieben:14.03.2023 16:22:36Mir ging es allerdings um den rein konzeptuellen Aspekt, dass ein mkdir kein Kopieren ist, auch wenn es hier faktisch das gleiche Ergebnis erzeugt wie ein cp.*


Wieso meinst du, dass sich `mkdir' und `touch' entsprechen? Den Gedanken kann ich nicht ganz nachvollziehen.hikaru hat geschrieben:14.03.2023 16:22:36*) offtopic:
mkdir ist ja von der Bedienung her für Verzeichnisse das, was für reguläre Dateien touch ist. Nach dem Konzept "alles ist eine Datei" sollte also auch das gehen um Verzeichnisse anzulegen:Es geht allerdings nicht, weil touch dafür nicht vorgesehen ist. Ist das Absicht oder nur fehlende Implementierung? Geht das z.B. unter Plan 9?Code: Alles auswählen
$ touch a/ touch: setting times of 'a/': No such file or directory
Manpage mkdir(1) hat geschrieben: mkdir - make directories
Dass `touch' Dateien anlegt, scheint mir nur eine Nebenfunktion zu sein. Dateien anlegen kann man auch mit `>foo' (wobei das etwaig vorhandene Dateien ueberschreibt). Bis in der 7th Edition `touch' eingefuehrt wurde (vermutlich wegen `make' und Backups) konnten auch schon Dateien angelegt werden. `mkdir' dagegen ist essenziell und war darum seit der 1st Edition vorhanden.Manpage touch(1) hat geschrieben: touch - change file timestamps
Use ed once in a while!
Re: Ausschließlich die Verzeichnisstruktur kopieren, ohne beinhaltete Dateien, geht das?
Weswegen das Äquivalent zu touch auch eher >>foo wäre.Dass `touch' Dateien anlegt, scheint mir nur eine Nebenfunktion zu sein. Dateien anlegen kann man auch mit `>foo' (wobei das etwaig vorhandene Dateien ueberschreibt).
Re: Ausschließlich die Verzeichnisstruktur kopieren, ohne beinhaltete Dateien, geht das?
Weil das Anlegen leerer Dateien für mich persönlich tatsächlich der praktische Hauptanwendungsfall von touch ist. Dass es "nebenbei" auch Timestamps ändert, hatte ich gestern nur peripher auf dem Schirm.Meillo hat geschrieben:14.03.2023 23:41:51Wieso meinst du, dass sich `mkdir' und `touch' entsprechen? Den Gedanken kann ich nicht ganz nachvollziehen.
Re: Ausschließlich die Verzeichnisstruktur kopieren, ohne beinhaltete Dateien, geht das?
Danke schön für die schönen Beispiele und die interessante dialogische Bearbeitung der Fragen. Das, neben den nützlichen Antworten, das Weiterlesen und das Testen spannend!
Viele Grüße
dengo
Viele Grüße
dengo
Re: Ausschließlich die Verzeichnisstruktur kopieren, ohne beinhaltete Dateien, geht das?
Code: Alles auswählen
rsync -af "-! */" QUELLE/ ZIEL/
VG
dengo
Re: Ausschließlich die Verzeichnisstruktur kopieren, ohne beinhaltete Dateien, geht das?
Die einfachste Lösung dafür wäre wohl find:
Da die Verzeichnisstruktur dann im Ziel aber fehlt, werden gleiche Dateinamen überschrieben.
EDIT:
Mit Erhaltung (Umbennennung) doppelter Dateien:
Code: Alles auswählen
find QUELLE/ -type f -exec cp {} ZIEL/ \;
EDIT:
Mit Erhaltung (Umbennennung) doppelter Dateien:
Code: Alles auswählen
find QUELLE/ -type f -exec cp --backup=numbered {} ZIEL/ \;
Re: Ausschließlich die Verzeichnisstruktur kopieren, ohne beinhaltete Dateien, geht das?
Prima! Wenn lediglich Dateien aus einem bestimmten Format, z.B. PDF, aus der Verzeichnisstruktur geholt werden sollten, wie würde diese Spezifizierung im Befehl formuliert?Mit Erhaltung (Umbennennung) doppelter Dateien:
Code: Alles auswählen
find QUELLE/ -type f -exec cp --backup=numbered {} ZIEL/ \;
Re: Ausschließlich die Verzeichnisstruktur kopieren, ohne beinhaltete Dateien, geht das?
Code: Alles auswählen
find QUELLE/ -type f -iname '*pdf' -exec cp --backup=numbered {} ZIEL/ \;
Re: Ausschließlich die Verzeichnisstruktur kopieren, ohne beinhaltete Dateien, geht das?
Ja, auch um das. Daher fragte ich mich zu Beginn, ob das dortige hier erweitere oder als neue Frage öffne.
Machen wir, was Dateien betrifft, dann dort weiter, da es hier primär um Verzeichnisstrukturen geht.
Wirklich spannend, was ihr her zaubert!
VG
dengo
Machen wir, was Dateien betrifft, dann dort weiter, da es hier primär um Verzeichnisstrukturen geht.
Wirklich spannend, was ihr her zaubert!
VG
dengo