Ich möchte verwenden, find
um alle Dateien und Verzeichnisse in einem bestimmten Stammverzeichnis für eine cpio
Operation rekursiv aufzulisten. Ich möchte jedoch nicht, dass das Stammverzeichnis selbst in den Pfaden angezeigt wird. Zum Beispiel bekomme ich momentan:
$ find diskimg
diskimg
diskimg/file1
diskimg/dir1
diskimg/dir1/file2
Aber ich würde gerne bekommen
file1
dir1
dir1/file2
(Beachten Sie, dass die Wurzel auch nicht in meiner gewünschten Ausgabe ist, aber das ist leicht zu entfernen tail
).
Ich arbeite unter OS X und würde es vorziehen, wenn möglich keine zusätzlichen Tools (z. B. GNU find) zu installieren, da ich das Skript, das ich schreibe, mit anderen OS X-Benutzern teilen möchte.
Ich bin mir bewusst, dass dies getan werden kann cut
, um das Root-Listing abzuschneiden, aber das scheint eine suboptimale Lösung zu sein. Gibt es eine bessere Lösung?
find diskimg/* | cut -d '/' -f2-
Antworten:
Wenn das, was Sie versuchen, nicht zu komplex ist, können Sie dies mit sed erreichen:
Oder
cut
:quelle
find diskimg | grep -v '^diskimg$' | sed -e 's|^diskimg/||'
(Beachten Sie, dass ich auch '-e' hinzugefügt habe, und eine^
ebenso gute Übung (hier nicht erforderlich, da Sie sicher sind, dass jede Zeile diese haben wird ... aber immer noch eine gute Übung und spart etwas CPU;))find diskimg | sed -e 's|^diskimg/*||'
(das '/ *'cut
Befehl ist sauberer als der, den ich verwendet habe. Ich mag das. (Diesed
Lösung ist auch schön, aber die Wiederholung vondiskimg/
ist ein wenig unglücklich).cd
zuerst in das Verzeichnis:Nach Abschluss des Vorgangs befinden Sie sich wieder in Ihrem Stammverzeichnis.
Ihren Dateien wird in diesem Fall ./ vorangestellt. die einzige Möglichkeit, die ich sehe, wäre die Verwendung von
cut
:Verwenden Sie eine Subshell, um zu vermeiden, dass das aktuelle Verzeichnis Ihrer Shell geändert wird (dies ist nicht erforderlich, wenn Sie die Ausgabe weiterleiten, da die linke Seite einer Pipe bereits in einer Subshell ausgeführt wird).
quelle
(cd diskimg && find . ; )
. Auf diese Weise wird dascd diskimg && find .
in einer Subshell erledigt: Wenn diese Subshell beendet wird, kehren Sie zu Ihrer eigenen Shell zurück, in welchem Verzeichnis auch immer Sie sich befanden.find *
ist ein anderer Weg um das nutzlose PräfixEin anderer, komplexerer Ansatz, der jedoch nur den Suchansatz aus meiner anderen Antwort verwendet:
quelle
find
Support- Versionenprintf
.find
unterstützt-printf
, während viele BSDsfind
einige der Funktionen von GNUfind
kopiert haben, hat-printf
noch keine kopiert (AFAIK).%P
für den relativen Pfad war das, was ich brauchte.Verwenden Sie das
realpath
Dienstprogramm:quelle
--relative-to
.