Я новичок в 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:"
Я хотел бы сделать это в СЕПГ, хотя.
И его друг, имя. Было бы здорово, если бы вы показали рабочий пример, который использует детали, предоставленные в вопросе. –
Я никогда не слышал о basename, и я рад, что знаю об этом сейчас, но я надеялся на помощь какого-нибудь sed regex. –