Wie erzwinge ich nur relative Pfade in der "Find" -Ausgabe?

16562
Shane

Ich versuche, ein Skript zu erstellen, das Dateien mit einer bestimmten Erweiterung in einer Reihe von Verzeichnissen zu einer einzelnen Teekugel komprimieren kann. Derzeit habe ich in der Skriptdatei:

find "$rootDir" -name '*doc' -exec tar rvf docs.tar {} \; 

Wo $rootDirist der Basispfad für die Suche?

Dies ist in Ordnung, außer dass die Pfade in der tar-Datei absolut sind. Ich würde es vorziehen, wenn die Pfade relativ sind $rootDir. Wie würde ich das machen?

Beispiel Strom, tar -tf docs.tarwo $rootDirist /home/username/testoutput:

home/username/test/subdir/test.doc home/username/test/second.doc 

Was ich wünsche, dass die Ausgabe:

./subdir/test.doc ./second.doc 
17

2 Antworten auf die Frage

11
David Spillett

Wenn Sie findvom gewünschten Stammverzeichnis aus starten und in findden Optionen keinen absoluten Startpunkt angeben, werden relative Pfade zu den von ihm erstellten tarBefehlsaufrufen ausgegeben . So wie:

cd $rootDir find . -name '*doc' -exec tar rvf docs.tar {} \; 

Wenn Sie das aktuelle Arbeitsverzeichnis nicht dauerhaft ändern möchten und bashähnlich wie Ihre Shell verwenden, können Sie dies tun

pushd $rootDir find . -name '*doc' -exec tar rvf docs.tar {} \; popd 

stattdessen.

Beachten Sie, dass Pushd / Popd nicht in allen Shells vorhanden ist. Überprüfen Sie die entsprechende Manpage. Sie sind in bash, aber nicht bei der Umsetzung Basis sh so während explizit mit /bin/bashkönnen Sie sich auf sie verlassen kann man nicht, wenn ein Skript für fragt /bin/shstattdessen (wie dies auf eine kleinere Schale abbilden, die nicht bash Erweiterungen hat)

Vielen Dank. Glänzend gearbeitet Wusste nicht, dass Linux Pushd / Popd hatte. Shane vor 14 Jahren 0
Oder benutzen Sie einfach `cd $ rootDir` und` cd -` (zumindest in `bash`). `(cd $ rootDir; find ...)` wäre auch möglich, dh alles in einer Subshell zu erledigen. Daniel Beck vor 11 Jahren 2
0
Gabriel

Sie können das %PFormat in der -printfDirektive verwenden:

find $ -name '*.doc' -printf "%P\n" 

wird in Ihrem Beispiel angezeigt:

subdir/test.doc second.doc 

Sie können diese findListe dann in einem forAusdruck verwenden, um unseren exec-Befehl auszuführen, wie in:

for f in $( find $ -name '*.doc' -printf "%P\n" ); do tar rvf docs.tar $ done