Ausschließlich die Verzeichnisstruktur kopieren, ohne beinhaltete Dateien, geht das?

Du hast Probleme mit Deinem eMail-Programm, Webbrowser oder Textprogramm? Dein Lieblingsprogramm streikt?
Antworten
Dengo
Beiträge: 251
Registriert: 07.07.2009 18:54:23

Ausschließlich die Verzeichnisstruktur kopieren, ohne beinhaltete Dateien, geht das?

Beitrag von Dengo » 14.03.2023 14:14:28

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

Benutzeravatar
Meillo
Moderator
Beiträge: 8817
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Ausschließlich die Verzeichnisstruktur kopieren, ohne beinhaltete Dateien, geht das?

Beitrag von Meillo » 14.03.2023 14:22:07

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.
Use ed once in a while!

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Ausschließlich die Verzeichnisstruktur kopieren, ohne beinhaltete Dateien, geht das?

Beitrag von JTH » 14.03.2023 14:23:33

Meillo hat geschrieben: ↑ zum Beitrag ↑
14.03.2023 14:22:07
`find -type d'
Mit einem --delete am Ende wäre das schon die Antwort auf die zweite Frage :) Ups, da hab ich wohl nicht richtig gelesen, was ich zitiert hab … Natürlich muss man dann mit -type f suchen, um die Dateien zu löschen.

Edit: Meillo war mit seinem Edit schneller.
Manchmal bekannt als Just (another) Terminal Hacker.

Benutzeravatar
Meillo
Moderator
Beiträge: 8817
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Ausschließlich die Verzeichnisstruktur kopieren, ohne beinhaltete Dateien, geht das?

Beitrag von Meillo » 14.03.2023 14:28:32

JTH hat geschrieben: ↑ zum Beitrag ↑
14.03.2023 14:23:33
Meillo hat geschrieben: ↑ zum Beitrag ↑
14.03.2023 14:22:07
`find -type d'
Mit einem --delete am Ende wäre das schon die Antwort auf die zweite Frage :)

Edit: Meillo war mit seinem Edit schneller.
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/{} \;
... koennte vielleicht sogar funkionieren. Wobei die find-Profis bestimmt noch ein paar Spezialoptionen beisteuern koennen.
Use ed once in a while!

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Ausschließlich die Verzeichnisstruktur kopieren, ohne beinhaltete Dateien, geht das?

Beitrag von JTH » 14.03.2023 14:31:38

Meillo hat geschrieben: ↑ zum Beitrag ↑
14.03.2023 14:28:32
Du hast fast recht. Bloss muss man `d' durch `f' ersetzen.
Ähm, ja selbstverständlich. Da hab ich wohl nur halb gelesen, was du geschrieben hast :oops:
Manchmal bekannt als Just (another) Terminal Hacker.

uname
Beiträge: 12075
Registriert: 03.06.2008 09:33:02

Re: Ausschließlich die Verzeichnisstruktur kopieren, ohne beinhaltete Dateien, geht das?

Beitrag von uname » 14.03.2023 15:20:06

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

Benutzeravatar
hikaru
Moderator
Beiträge: 13588
Registriert: 09.04.2008 12:48:59

Re: Ausschließlich die Verzeichnisstruktur kopieren, ohne beinhaltete Dateien, geht das?

Beitrag von hikaru » 14.03.2023 15:24:41

uname hat geschrieben: ↑ zum Beitrag ↑
14.03.2023 15:20:06
To do so, add -f"+ */" -f"- *" before the source directory.
Sowas ähnliches wollte ich auch gerade schreiben. Es geht noch kürzer:

Code: Alles auswählen

rsync -af "-! */" QUELLE/ ZIEL/

Benutzeravatar
Meillo
Moderator
Beiträge: 8817
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Ausschließlich die Verzeichnisstruktur kopieren, ohne beinhaltete Dateien, geht das?

Beitrag von Meillo » 14.03.2023 15:40:29

hikaru hat geschrieben: ↑ zum Beitrag ↑
14.03.2023 15:24:41
uname hat geschrieben: ↑ zum Beitrag ↑
14.03.2023 15:20:06
To do so, add -f"+ */" -f"- *" before the source directory.
Sowas ähnliches wollte ich auch gerade schreiben. Es geht noch kürzer:

Code: Alles auswählen

rsync -af "-! */" QUELLE/ ZIEL/
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.

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!

Benutzeravatar
hikaru
Moderator
Beiträge: 13588
Registriert: 09.04.2008 12:48:59

Re: Ausschließlich die Verzeichnisstruktur kopieren, ohne beinhaltete Dateien, geht das?

Beitrag von hikaru » 14.03.2023 16:22:36

Meillo hat geschrieben: ↑ zum Beitrag ↑
14.03.2023 15:40:29
Interessant, mit Filter-Rules habe ich mich bei rsync noch nie beschaeftigt.
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: ↑ zum Beitrag ↑
14.03.2023 15:40:29
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.
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.
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
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?

Benutzeravatar
Meillo
Moderator
Beiträge: 8817
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Ausschließlich die Verzeichnisstruktur kopieren, ohne beinhaltete Dateien, geht das?

Beitrag von Meillo » 14.03.2023 23:41:51

hikaru hat geschrieben: ↑ zum Beitrag ↑
14.03.2023 16:22:36
Meillo hat geschrieben: ↑ zum Beitrag ↑
14.03.2023 15:40:29
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.
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.
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: ↑ zum Beitrag ↑
14.03.2023 16:22:36
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.*
;-) Als Informatiker interpretiere ich Anforderungsbeschreibungen wohl immer automatisch nach ``was will die Person'' und nicht nach ``was sagt sie''. :-D

hikaru hat geschrieben: ↑ zum Beitrag ↑
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:

Code: Alles auswählen

$ touch a/
touch: setting times of 'a/': No such file or directory
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?
Wieso meinst du, dass sich `mkdir' und `touch' entsprechen? Den Gedanken kann ich nicht ganz nachvollziehen.
Manpage mkdir(1) hat geschrieben: mkdir - make directories
Manpage touch(1) hat geschrieben: touch - change file timestamps
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.
Use ed once in a while!

tobo
Beiträge: 1993
Registriert: 10.12.2008 10:51:41

Re: Ausschließlich die Verzeichnisstruktur kopieren, ohne beinhaltete Dateien, geht das?

Beitrag von tobo » 15.03.2023 00:28:10

Dass `touch' Dateien anlegt, scheint mir nur eine Nebenfunktion zu sein. Dateien anlegen kann man auch mit `>foo' (wobei das etwaig vorhandene Dateien ueberschreibt).
Weswegen das Äquivalent zu touch auch eher >>foo wäre.

Benutzeravatar
hikaru
Moderator
Beiträge: 13588
Registriert: 09.04.2008 12:48:59

Re: Ausschließlich die Verzeichnisstruktur kopieren, ohne beinhaltete Dateien, geht das?

Beitrag von hikaru » 15.03.2023 09:09:05

Meillo hat geschrieben: ↑ zum Beitrag ↑
14.03.2023 23:41:51
Wieso meinst du, dass sich `mkdir' und `touch' entsprechen? Den Gedanken kann ich nicht ganz nachvollziehen.
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.

Dengo
Beiträge: 251
Registriert: 07.07.2009 18:54:23

Re: Ausschließlich die Verzeichnisstruktur kopieren, ohne beinhaltete Dateien, geht das?

Beitrag von Dengo » 19.03.2023 00:24:36

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

Dengo
Beiträge: 251
Registriert: 07.07.2009 18:54:23

Re: Ausschließlich die Verzeichnisstruktur kopieren, ohne beinhaltete Dateien, geht das?

Beitrag von Dengo » 09.08.2023 05:31:11

Code: Alles auswählen

rsync -af "-! */" QUELLE/ ZIEL/
Das Zeichen / steht also für Verzeichnisse. Welches Zeichen steht denn für Dateien? Ich würde auch gerne die Option, ausschließlich den Inhalt der Verzeichnisse und Unterverzeichnisse kopieren. Wenn ich / durch f ersetze, bekomme ich nicht das gewünschte Ergebnis. Wie muss der Befehl dafür aussehen?
VG
dengo

tobo
Beiträge: 1993
Registriert: 10.12.2008 10:51:41

Re: Ausschließlich die Verzeichnisstruktur kopieren, ohne beinhaltete Dateien, geht das?

Beitrag von tobo » 09.08.2023 09:16:54

Die einfachste Lösung dafür wäre wohl find:

Code: Alles auswählen

find QUELLE/ -type f -exec cp {} ZIEL/ \;
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 --backup=numbered {} ZIEL/ \;

Dengo
Beiträge: 251
Registriert: 07.07.2009 18:54:23

Re: Ausschließlich die Verzeichnisstruktur kopieren, ohne beinhaltete Dateien, geht das?

Beitrag von Dengo » 09.08.2023 15:49:17

Mit Erhaltung (Umbennennung) doppelter Dateien:

Code: Alles auswählen

find QUELLE/ -type f -exec cp --backup=numbered {} ZIEL/ \;
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?

Benutzeravatar
hikaru
Moderator
Beiträge: 13588
Registriert: 09.04.2008 12:48:59

Re: Ausschließlich die Verzeichnisstruktur kopieren, ohne beinhaltete Dateien, geht das?

Beitrag von hikaru » 09.08.2023 15:56:35

Code: Alles auswählen

find QUELLE/ -type f -iname '*pdf' -exec cp --backup=numbered {} ZIEL/ \;
Disclaimer: Das kopiert alle Dateien, die (caseinsensitiv) auf "pdf" enden, was nicht das Selbe ist wie "alle Dateien vom Dateityp PDF".

tobo
Beiträge: 1993
Registriert: 10.12.2008 10:51:41

Re: Ausschließlich die Verzeichnisstruktur kopieren, ohne beinhaltete Dateien, geht das?

Beitrag von tobo » 09.08.2023 16:17:09

Dengo hat geschrieben: ↑ zum Beitrag ↑
09.08.2023 15:49:17
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?
Geht es dir jetzt um das hier?

Dengo
Beiträge: 251
Registriert: 07.07.2009 18:54:23

Re: Ausschließlich die Verzeichnisstruktur kopieren, ohne beinhaltete Dateien, geht das?

Beitrag von Dengo » 09.08.2023 18:00:41

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

Antworten