2009-07-25 8 views
8

Je suis nouveau à sed, et besoin de saisir juste le nom de fichier de la sortie de find. J'ai besoin de trouver le chemin complet pour une autre partie de mon script, mais je veux juste imprimer le nom du fichier sans le chemin. Je dois également correspondre à partir du début de la ligne, pas à la fin. En anglais, je veux faire correspondre, le premier groupe de caractères se terminant par ". Txt" ne contenant pas un "/". Voici ma tentative qui ne fonctionne pas:Utiliser sed pour récupérer le nom de fichier du chemin d'accès complet?

[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 

Voici la sortie que je veux:

two.txt 
one.txt 

Ok, donc les solutions proposées a répondu à ma question initiale, mais je suppose que je l'ai demandé de mal. Je ne veux pas tuer le reste de la ligne après le suffixe que je cherche. Donc, pour être plus clair, si les conditions suivantes:

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' 

Ce que je veux:

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

Désolé pour cette confusion. Ma question initiale couvrait simplement la première partie de ce que j'essaie de faire.

2ème édition: voici ce que je suis venu avec:

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

Ce n'est pas tout à fait ce que je veux bien. Au lieu de définir le répertoire de destination en tant que variable shell, je voudrais changer la première opération sed de sorte qu'il ne change que la sortie cp avant le "->" sur chaque ligne, de sorte que j'ai toujours la 2ème partie de la sortie cp opérer avec un autre "-e".

3ème édition: Je n'ai pas compris cela à l'aide, mais ne suit que de regex sed encore la tâche en utilisant Perl:

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

Je voudrais le faire dans sed bien.

Répondre

7

Quelque chose comme ça devrait faire l'affaire:

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

ou, un peu plus clair,

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

Pourquoi n'utilisez-vous pas basename à la place?

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

Et son ami, dirname. Serait bien si vous avez montré un exemple de travail qui utilise les détails fournis dans la question. –

+0

Je n'avais jamais entendu parler de basename, et je suis content de le savoir maintenant, mais j'espérais avoir de l'aide de sed regex. –

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

Pas besoin d'outils externes si vous utilisez trouver GNU

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

Comment je ne savais pas à ce sujet?!? C'est une fonctionnalité incroyablement pratique à connaître. Je vous remercie! Isolez les répertoires avec 'find/path -name" * .txt "-printf"% h \ n "' – whereisalext

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