Listen Sie rekursiv alle Dateien mit dem Pfad relativ zum Verzeichnis auf, das durchsucht wird

0

Nehmen wir an, wir haben so etwas wie:

/tmp/tmp.KVKc82GspR
/tmp/tmp.KVKc82GspR/CONTENTS
/tmp/tmp.KVKc82GspR/opt
/tmp/tmp.KVKc82GspR/opt/source
/tmp/tmp.KVKc82GspR/opt/source/sm
/tmp/tmp.KVKc82GspR/opt/source/sm/LVHDoISCSISR.py
/tmp/tmp.KVKc82GspR/opt/source/sm/LVHDoHBASR.py
/tmp/tmp.KVKc82GspR/verify_update

Ich möchte bekommen:

CONTENTS
opt/source/sm/LVHDoISCSISR.py
opt/source/sm/LVHDoHBASR.py
verify_update

Ich habe einige Optionen, aber ich mag sie nicht:

  • cd /tmp/tmp.KVKc82GspR; find . -name '*' würde hinzufügen ./ vorher und schlimmer würde sich ändern Aktuelles Verzeichnis.
  • ls funktioniert nicht gut rekursiv

Hinweis: Ich würde nach Möglichkeit eine einzeilige Lösung bevorzugen: D

sorin
quelle

Antworten:

2

Mit GNU find:

find /tmp/tmp.KVKc82GspR -mindepth 1 -printf '%P\n'
Ignacio Vazquez-Abrams
quelle
2

Wenn Sie GNU find verwenden, können Sie dies zumindest tun:

(cd /tmp/tmp.KVKc82GspR; find . -type f -printf '%P\n')

Das () bewirkt, dass es in einer Subshell ausgeführt wird, sodass Ihr CWD nicht betroffen ist. -type f stimmt nur mit regulären Dateien überein. Dies ist möglicherweise ein besserer Stil als -name '*', weist jedoch eine geringfügig andere Semantik auf.

rici
quelle
0

Eine andere Möglichkeit, ähnlich der Antwort von @rici:

(cd /tmp/tmp.KVKc82GspR; find * -type f -print)

Das vermeidet die -printf Das mag ein wenig (aber vielleicht nicht merklich) weniger effizient sein und ist eine nicht universelle GNU-Erweiterung - es schlägt jedoch fehl, wenn Sie Dateien / Unterverzeichnisse haben, die mit beginnen ..

Du könntest es auch einfach nachbearbeiten find s Ausgabe:

find /tmp/tmp.KVKc82GspR -type f -print | sed -e 's;^/tmp/tmp.KVKc82GspR/;;'
twalberg
quelle
0
shopt -s globstar

startdir="/tmp/tmp.KVKc82GspR"
for file in "${startdir}"/**; do
    echo "${file/${startdir}}"
done

Dies findet alle Dateien im Verzeichnis und listet sie auf. Es ist rekursiv. Ich glaube, es wird Bash 4 oder höher erfordern.

Wenn Sie die Dateien in Ihrem CURRENT-Verzeichnis sehen möchten:

shopt -s globstar
# the ls command has a 1 (one) as the first argument
ls -1d **

Das kann also ein Einzeiler sein:

shopt -s globstar ; ls 1d **
UtahJarhead
quelle