使用sed从完整路径获取文件名?

rya*_*n_m 12 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
Run Code Online (Sandbox Code Playgroud)

这是我想要的输出:

two.txt
one.txt
Run Code Online (Sandbox Code Playgroud)

好的,所以提供的解决方案回答了我原来的问题,但我想我错了.我不想杀死我正在搜索的文件后缀的其余部分.所以,更清楚的是,如果如下:

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'
Run Code Online (Sandbox Code Playgroud)

我想要的是:

bash$ new_mp3s=\`find mp3Dir -type f -name \*.mp3\` && cp -rfv $new_mp3s dest | sed ???
 `one.mp3' -> `/dest'
 `two.mp3' -> `/dest'
Run Code Online (Sandbox Code Playgroud)

对困惑感到抱歉.我原来的问题刚刚涵盖了我想要做的第一部分.

第二次编辑:这是我想出的:

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

这不是我想要的.我没有将目标目录设置为shell变量,而是想更改第一个sed操作,因此它只更改cp每行上" - >"之前的输出,这样我仍然可以使用cp输出的第二部分来操作另一个'-e'.

第3次编辑:我还没有使用sed正则表达式来解决这个问题,但以下是使用Perl的工作:

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

我想在sed中这样做.

Emi*_*l H 16

为什么不使用basename呢?

find /mydir | xargs -I{} basename {}
Run Code Online (Sandbox Code Playgroud)


dav*_*ave 11

像这样的东西应该做的伎俩:

find yourdir -type f -name \*.txt | sed 's/.*\///'
Run Code Online (Sandbox Code Playgroud)

或者,稍微清楚一点,

find yourdir -type f -name \*.txt | sed 's:.*/::'
Run Code Online (Sandbox Code Playgroud)


gho*_*g74 10

如果使用GNU find,则无需外部工具

find /path -name "*.txt" -printf "%f\n"
Run Code Online (Sandbox Code Playgroud)