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?


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-

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

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'

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 {} \;

Genial, gracias por mostrarme --relative-to.
nneonneo 01 de
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.