2009-07-25 3 views
8

Я новичок в sed, и мне нужно захватить только имя файла с вывода find. Мне нужно найти вывод всего пути для другой части моего скрипта, но я хочу просто напечатать имя файла без пути. Мне также нужно сопоставить , начиная с начала линии, а не с конца. На английском языке я хочу совместить первую группу символов, заканчивающуюся на «.txt», не содержащую «/». Вот моя попытка, что не работает:Использование sed для захвата имени файла из полного пути?

[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 

Вот результат я хочу:

two.txt 
one.txt 

Итак, предложенные решения ответили на мой первоначальный вопрос, но я предполагаю, что я спросил его неправильно. Я не хочу убивать остальную часть строки после суффикса файла, который я ищу. Таким образом, чтобы быть более понятным, если следующее:

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' 

Что я хочу:

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

Извините за путаницу. Мой первоначальный вопрос просто охватывал первую часть того, что я пытаюсь сделать.

второй править: вот что я придумал:

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

Это не совсем то, что я хочу, хотя. Вместо того, чтобы указывать целевой каталог как переменную оболочки, я хотел бы изменить первую операцию sed, поэтому она только изменяет вывод cp перед «->» на каждой строке, так что у меня все еще есть вторая часть вывода cp работать с другим «-e».

третьего редактирования: Я не понял это только с помощью СЭД регулярное выражение Здесь еще, но следующий делает работу с помощью Perl:

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

Я хотел бы сделать это в СЕПГ, хотя.

ответ

7

Что-то вроде этого следует сделать трюк:

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

или немного более четкое,

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

Почему бы вам вместо этого не использовать basename?

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

И его друг, имя. Было бы здорово, если бы вы показали рабочий пример, который использует детали, предоставленные в вопросе. –

+0

Я никогда не слышал о basename, и я рад, что знаю об этом сейчас, но я надеялся на помощь какого-нибудь sed regex. –

8

Нет необходимости внешних инструментов при использовании GNU найти

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

Как я не знал об этом?!? Это невероятно удобная функция. Спасибо! Изолировать каталоги с помощью 'find/path -name '* .txt" -printf "% h \ n" ' – whereisalext

-2
path="parentdir2/parentdir1/parentdir0/dir/FileName" 
    name=${path##/*} 
Смежные вопросы