Использование sed для захвата имени файла из полного пути?

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

ryan@fizz:~$ find /home/ryan/Desktop/test/ -type f -name *.txt
/home/ryan/Desktop/test/two.txt
/home/ryan/Desktop/test/one.txt
ryan@fizz:~$ 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'

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

2-й редактировать: вот что я придумал с:

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

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

3-й редактировать: Я еще не понял этого, используя только sed regex, но следующее делает работу, используя На Perl:

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

Я хотел бы сделать это в sed, хотя.

5 ответов


что-то вроде этого должно сделать трюк:

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

или, немного понятнее,

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

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

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

Не нужны внешние инструменты, если используете GNU найти

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

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

    path="parentdir2/parentdir1/parentdir0/dir/FileName"
    name=${path##/*}