2009-07-25 6 views
8

Soy nuevo en sed, y necesito obtener solo el nombre de archivo de la salida de find. Necesito encontrar la ruta completa para otra parte de mi script, pero solo quiero imprimir el nombre de archivo sin la ruta. También necesito hacer coincidir comenzando desde el principio de la línea, no desde el final. En inglés, quiero hacer coincidir, el primer grupo de caracteres termina con ".txt" que no contiene un "/". Aquí está mi intento de que no funciona:¿Usar sed para agarrar el nombre de archivo de la ruta completa?

[email protected]:~$ find /home/ryan/Desktop/test/ -type f -name \*.txt 
/home/ryan/Desktop/test/two.txt 
/home/ryan/Desktop/test/one.txt 
[email protected]:~$ find /home/ryan/Desktop/test/ -type f -name \*.txt | sed s:^.*/[^*.txt]::g 
esktop/test/two.txt 
ne.txt 

Aquí está la salida que quiero:

two.txt 
one.txt 

Ok, por lo que las soluciones ofrecidas respondió a mi pregunta original, pero supongo que pedí mal. No quiero matar el resto de la línea más allá del sufijo del archivo que estoy buscando. lo tanto, para ser más claros, si el siguiente:

bash$ new_mp3s=\`find mp3Dir -type f -name \*.mp3\` && cp -rfv $new_mp3s dest 
`/mp3Dir/one.mp3' -> `/dest/one.mp3' 
`/mp3Dir/two.mp3' -> `/dest/two.mp3' 

Lo que quiero es:

bash$ new_mp3s=\`find mp3Dir -type f -name \*.mp3\` && cp -rfv $new_mp3s dest | sed ??? 
`one.mp3' -> `/dest' 
`two.mp3' -> `/dest' 

Lo siento por la confusión. Mi pregunta original acaba de cubrir la primera parte de lo que estoy tratando de hacer.

segunda edición: aquí es lo que he llegado con:

DEST=/tmp && cp -rfv `find /mp3Dir -type f -name \*.mp3` $DEST | sed -e 's:[^\`].*/::' -e "s:$: -> $DEST:" 

Esto no es exactamente lo que quiero sin embargo. En lugar de establecer el directorio de destino como una variable de shell, me gustaría cambiar la primera operación sed por lo que solo cambia la salida cp antes de "->" en cada línea, por lo que todavía tengo la segunda parte de la salida cp a operar con otro '-e'.

tercera edición: no he dado cuenta de esto usando expresiones regulares sin embargo, sólo de sed, pero el siguiente hace el trabajo usando Perl:

cp -rfv `find /mp3Dir -type f -name \*.mp3` /tmp | perl -pe "s:.*/(.*.mp3).*\`(.*/).*.mp3\'$:\$1 -> \$2:" 

me gustaría hacerlo de sed sin embargo.

Respuesta

7

Algo como esto debe hacer el truco:

find yourdir -type f -name \*.txt | sed 's/.*\///' 

o, un poco más claro,

find yourdir -type f -name \*.txt | sed 's:.*/::' 
15

¿Por qué no usas basename en su lugar?

find /mydir | xargs -I{} basename {} 
+1

Y su amigo, dirname. Sería genial si mostrara un ejemplo de trabajo que utiliza los detalles proporcionados en la pregunta. –

+0

nunca había oído hablar de basename, y estoy contento de saberlo ahora, pero esperaba alguna ayuda de sed regex. –

0
find /mydir | awk -F'/' '{print $NF}' 
8

No se necesitan herramientas externas si están usando GNU encontrar

find /path -name "*.txt" -printf "%f\n" 
+0

¿Cómo no sabía sobre esto?!? Esta es una característica increíblemente útil para saber. ¡Gracias! Aislar directorios con 'find/path -name" * .txt "-printf"% h \ n "' – whereisalext

-2
path="parentdir2/parentdir1/parentdir0/dir/FileName" 
    name=${path##/*} 
Cuestiones relacionadas