Salida "encontrar" relativa al directorio

34

Me gustaría usar findpara enumerar todos los archivos y directorios de forma recursiva en una raíz determinada para una cpiooperación. Sin embargo, no quiero que el directorio raíz aparezca en las rutas. Por ejemplo, actualmente obtengo:

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

Pero me gustaría obtener

file1
dir1
dir1/file2

(tenga en cuenta que la raíz tampoco está en mi salida deseada, pero es fácil deshacerse de ella tail).

Estoy en OS X, y preferiría no instalar ninguna herramienta adicional (por ejemplo, GNU find) si es posible, ya que me gustaría compartir el script que estoy escribiendo con otros usuarios de OS X.

Sé que esto se puede hacer cutpara cortar la lista raíz, pero parece una solución subóptima. ¿Hay una mejor solución disponible?

nneonneo
fuente
find diskimg/* | cut -d '/' -f2-
nik.shornikov

Respuestas:

18

Si lo que intenta hacer no es demasiado complejo, puede lograr esto con sed:

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

O cut:

find diskimg | cut -sd / -f 2-
BriGuy
fuente
puede elegir (casi) cualquier separador para el comando, entonces: find diskimg | grep -v '^diskimg$' | sed -e 's|^diskimg/||'(tenga en cuenta que también agregué '-e', y una ^buena práctica (no es necesario aquí, ya que está seguro de que todas las líneas tendrán esto ... pero sigue siendo una buena práctica) , y guarda algo de CPU;))
Olivier Dulac
Otra forma sin grep: find diskimg | sed -e 's|^diskimg/*||' (el '/ *' coincidirá con cualquier número de '/', incluso 0)
Olivier Dulac
Este cutcomando es más limpio que el que usé; Me gusta. (La sedsolución también es buena, pero la repetición diskimg/es un poco desafortunada).
nneonneo
29

cd primero en el directorio:

cd diskimg && find . 

Al finalizar, volverá a su directorio raíz.

Sus archivos se antepondrán con ./ en este caso; la única forma en que veo alrededor sería usando cut:

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

Use una subshell para evitar cambiar el directorio actual de su shell (esto no es necesario si está canalizando la salida ya que el lado izquierdo de una tubería ya se ejecuta en una subshell).

(cd diskimg && find .)
Stephan
fuente
55
de estar de vuelta en el directorio inicial al finalizar: añadir entre paréntesis: (cd diskimg && find . ; ). De esta forma el cd diskimg && find .se lleva a cabo en un subnivel: cuando ese subnivel salidas que están de vuelta a su propia concha, en cualquier directorio donde estábamos.
Olivier Dulac
1
find *es otra manera alrededor del prefijo inútil
nik.shornikov
23

Otro, más complejo pero que solo usa el enfoque de búsqueda de mi otra respuesta:

find diskimg -mindepth 1 -printf '%P\n'
Stephan
fuente
No todas las versiones de findsoporte printf.
jordanm
1
Seguramente; Mi OSX no, parece. En parte por qué ofrecí otra solución.
Stephan
2
@Stephan: la próxima vez puedes combinar este tipo de respuestas en una sola. No es necesario hacer múltiples respuestas para variaciones como esta.
slm
2
Solo GNU es findcompatible -printf, mientras que muchos BSD findhan copiado algunas de las características de GNU find, ninguno ha copiado -printftodavía (AFAIK).
Stéphane Chazelas
el %Pde la ruta relativa era lo que necesitaba.
Fl0v0
4

Usa la realpathutilidad:

find diskimg -exec realpath --relative-to diskimg {} \;
dwjbosman
fuente
Genial, gracias por mostrarme --relative-to.
nneonneo 01 de