Использование 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:.*/::'