Einzeiler, um bestimmte Files zusammenzukopieren
Einzeiler, um bestimmte Files zusammenzukopieren
Hi Leute,
gesetzt den Fall, ich befinde mich im Unterverzeichnis home/user/temp.
Dieses hat wieder 100e Unterverzeichnisse. In einigen davon befinden sich *.ttf Dateien. Die hätte ich jetzt gerne alle dorthin kopiert, wo ich mich gerade befinde. Wie kriege ich das mit einem Einzeiler hin?
Kommt irgendwo drin "find . -name *.ttf" vor, denke ich. Und sonst?
gesetzt den Fall, ich befinde mich im Unterverzeichnis home/user/temp.
Dieses hat wieder 100e Unterverzeichnisse. In einigen davon befinden sich *.ttf Dateien. Die hätte ich jetzt gerne alle dorthin kopiert, wo ich mich gerade befinde. Wie kriege ich das mit einem Einzeiler hin?
Kommt irgendwo drin "find . -name *.ttf" vor, denke ich. Und sonst?
Re: Einzeiler, um bestimmte Files zusammenzukopieren
exec, cp und {} müssen auch noch rein, denke ich.Und sonst?
Re: Einzeiler, um bestimmte Files zusammenzukopieren
Dankeee, daraus konnte ich was frickeln
Code: Alles auswählen
find . -name *.ttf -exec cp {} . \;
Re: Einzeiler, um bestimmte Files zusammenzukopieren
Das * sollte escapt werden, sonst expandiert es auf moeglicherweise schon vorhandene Dateien.
Schoener:Erklaerung:
find | xargs ist effizienter, weil nicht fuer jeden Kopiervorgang ein neuer (cp-)Prozess gestartet werden muss, sondern die komplette verfuegbare Kommandozeile (meist 8k Zeichen) ausgenutzt wird, d.h. ein cp kann nun mehrere Hundert Dateien auf einmal kopieren. Entsprechend entfallen mehrere Hundert ueberfluessige fork()s.
Allerdings sind die Pfadtrenner bei find bzw. dem automatisch verwendeten find -print ganz normale Newlines, die auch in einem Dateinamen vorkommen koennten. -print0 und xargs -0 verwendet dagegen Nullbytes, die es im Dateisystem nicht geben kann. Das Flag -t bei cp gibt das Zielverzeichnis an, sodass manschreiben kann anstattxargs kann die Argumente (hier: Dateipfade, die find liefert) nur hinten an die Kommandozeile anfuegen.
Gruss Cae
Schoener:
Code: Alles auswählen
$ find /path/to/source/ -name '*.ttf' -print0 | xargs -0r -- cp -t .
find | xargs ist effizienter, weil nicht fuer jeden Kopiervorgang ein neuer (cp-)Prozess gestartet werden muss, sondern die komplette verfuegbare Kommandozeile (meist 8k Zeichen) ausgenutzt wird, d.h. ein cp kann nun mehrere Hundert Dateien auf einmal kopieren. Entsprechend entfallen mehrere Hundert ueberfluessige fork()s.
Allerdings sind die Pfadtrenner bei find bzw. dem automatisch verwendeten find -print ganz normale Newlines, die auch in einem Dateinamen vorkommen koennten. -print0 und xargs -0 verwendet dagegen Nullbytes, die es im Dateisystem nicht geben kann. Das Flag -t bei cp gibt das Zielverzeichnis an, sodass man
Code: Alles auswählen
$ cp -t target a b c d
Code: Alles auswählen
$ cp a b c d target
Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.
—Bruce Schneier
Re: Einzeiler, um bestimmte Files zusammenzukopieren
Ein equivalent zu dem:
Schöner und schneller...
Dafür hat man halt das 8k limit. Nimmt man an, dass ein Pfad im schmitt 15 Zeichen hat (Was eher extrem kurz ist Beispiel ./musik/favorit/meine_lieblingsdate.mp3 hat 40 Zeichen 15 wären ./ord/mini.mp3), ist das maximal bei mir nichtmal eine Sekunde, die eingespart werden kann.
Code: Alles auswählen
find /path/to/source/ -name '*.ttf' -print0 | xargs -0r -- cp -t .
Code: Alles auswählen
find /path/to/source/ -name '*.ttf' -exec cp -t . {} +
rot: Moderator wanne spricht, default: User wanne spricht.
Re: Einzeiler, um bestimmte Files zusammenzukopieren
Wenn es um nur eine Verzeichnisstufe tiefer geht (das ist mir nicht klar geworden), dann doch ganz einfach so:
Und in einer neueren bash oder der zsh fuer beliebig tiefe Unterverzeichnisse AFAIK auch so:
Portabel geht's auf dem von euch bereits beschrittenen Weg.
Code: Alles auswählen
cp */*.ttf .
Code: Alles auswählen
cp **/*.ttf .
Use ed once in a while!