it-swarm.com.de

Ausgabe "find" relativ zum Verzeichnis

Ich möchte find verwenden, um alle Dateien und Verzeichnisse rekursiv in einem bestimmten Stammverzeichnis für eine cpio -Operation aufzulisten. Ich möchte jedoch nicht, dass das Stammverzeichnis selbst in den Pfaden angezeigt wird. Zum Beispiel bekomme ich derzeit:

$ find diskimg
diskimg
diskimg/file1
diskimg/dir1
diskimg/dir1/file2

Aber ich würde gerne bekommen

file1
dir1
dir1/file2

(Beachten Sie, dass sich die Wurzel auch nicht in meiner gewünschten Ausgabe befindet, aber mit tail leicht zu entfernen ist).

Ich bin 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 teilen möchte OS X-Benutzer.

Ich bin mir bewusst, dass dies mit cut gemacht werden kann, um die Stammliste abzuschneiden, aber das scheint eine suboptimale Lösung zu sein. Gibt es eine bessere Lösung?

35
nneonneo

Wenn das, was Sie versuchen, nicht zu komplex ist, können Sie dies mit sed erreichen:

find diskimg | sed -n 's|^diskimg/||p'

Oder cut:

find diskimg | cut -sd / -f 2-
18
BriGuy

cd zuerst in das Verzeichnis:

cd diskimg && find . 

Nach Abschluss befinden Sie sich wieder in Ihrem Stammverzeichnis.

In diesem Fall wird Ihren Dateien ./ vorangestellt. Der einzige Weg, den ich sehe, wäre die Verwendung von cut:

{ cd diskimg && find .; } | tail -n +2 | cut -c 3-

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).

(cd diskimg && find .)
29
Stephan

Ein anderer, komplexerer, aber nur mit dem Find-Ansatz meiner anderen Antwort:

find diskimg -mindepth 1 -printf '%P\n'
24
Stephan

Verwenden Sie das Dienstprogramm realpath:

find diskimg -exec realpath --relative-to diskimg {} \;
5
dwjbosman