Wie kopiere ich den Kopf der Dateien in einen anderen Ordner und halte die Baumstruktur?

559
user2986

Ich habe eine Menge riesiger Dateien (jeweils 4 GB) mit der gleichen Erweiterung in einer Verzeichnisstruktur auf einem Netzlaufwerk. Ich interessiere mich jedoch nur für die ersten Bytes, daher möchte ich sie alle auf mein lokales Laufwerk kopieren. mit den gleichen Dateinamen und der gleichen Ordnerstruktur.

Ich habe es versucht:

$ find . -type d -exec mkdir -p ~/Desktop/heads/{} \; $ find . -type f -name "*.ext" -exec head -c 128 {} > ~/Desktop/heads/{} \; 

Es funktioniert jedoch nicht, da sie alle in einer Datei mit dem Namen '{}' abgelegt werden. Dies liegt wahrscheinlich daran, dass der Operator '>' nicht als Teil des -exec-Arguments interpretiert wird und ich ihn mit '\>' entkomme. Dann wird es auf das Hauptargument beschränkt, das auch nicht funktioniert.

2
Da OSX 10.7 noch nicht öffentlich veröffentlicht wurde, können Sie vielleicht sagen, dass Sie OSX in der Fragezeile verwenden, sodass Benutzer, die sich nicht auf 10.7 befinden, die Frage nicht ignorieren, weil Sie sie noch nie verwendet haben. James T Snell vor 13 Jahren 0
Es ist mit Snow Leopard getaggt, aber das ist Version 10.6. Meinen Sie damit, dass Sie Lion 10.7 oder Snow Leopard 10.6 noch veröffentlichen werden? Noel M vor 13 Jahren 0
Ich meinte 10.6.7, ich habe es der Einfachheit halber in Schneeleopard geändert. Vielen Dank. user2986 vor 13 Jahren 0
Ich habe die Version einfach komplett entfernt, es ist * wirklich * nicht so wichtig. slhck vor 13 Jahren 0

2 Antworten auf die Frage

1
slhck

Sie haben richtig festgestellt, dass das Problem die >Weiterleitung ist. Zwei Lösungen:

Verwenden Sie entweder so etwas:

find . -type f -name "*.ext" -exec sh -c "head -c 128 '{}' > ~/Desktop/heads/'{}'" \; 

Oder Sie können das '{}'Argument auch als Argument an die Subshell übergeben:

find . -type f -name "*.ext" -exec sh -c 'head -c 128 $1 > ~/Desktop/heads/$1' -- {} \; 

Letzteres funktioniert, weil -- {}der Dateiname als Argument an übergeben wird sh -c, auf das mit zugegriffen werden kann $1. Beachten Sie, dass Sie jetzt einfache Anführungszeichen 'anstelle von Anführungszeichen verwenden müssen.


Update: Ich habe tatsächlich eine Stack Overflow-Frage gefunden, die das zugrunde liegende Problem von Ihnen abdeckt, nämlich die Verwendung >innerhalb xargsoder ähnlicher Befehle:

Wie verwende ich> in einem xargs-Befehl?

Ich möchte einen bash-Befehl finden, mit dem ich jede Datei in einem Verzeichnis grep und die Ausgabe dieses grep in eine separate Datei schreiben kann. [...]

Verdammt! Ich war kaum zu spät. bahamat vor 13 Jahren 0
1
bahamat

Ihre Weiterleitung bricht es. Ändern Sie dies:

$ find . -type d -exec mkdir -p ~/Desktop/heads/{} $ find . -type f -name "*.ext" -exec sh -c "head -c 128 {} > ~/Desktop/heads/{}" \;