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

使用sed从完整路径获取文件名?,sed,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/

我是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'
很抱歉给你带来了困惑。我最初的问题只是涵盖了我要做的第一部分

第二次编辑: 以下是我的想法:

DEST=/tmp && cp -rfv `find /mp3Dir -type f -name \*.mp3` $DEST | sed -e 's:[^\`].*/::' -e "s:$: -> $DEST:"
但这不是我想要的。我不想将目标目录设置为shell变量,而是想更改第一个
sed
操作,这样它只会更改每行“->”之前的
cp
输出,这样我仍然可以使用另一个“-e”操作
cp
输出的第二部分

第三次编辑: 我还没有用sed regex解决这个问题,但是下面使用Perl完成了这项工作:

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

不过我想在sed中使用它。

为什么不改用basename呢

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

像这样的事情应该可以做到:

find yourdir -type f -name \*.txt | sed 's/.*\///'
或者,稍微清楚一点

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

如果使用GNU查找,则不需要外部工具

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

我是根据题目来回答这个问题的:使用sed从fullpath获取文件名。 所以,使用sed,以下是对我有效的方法

FILENAME=$(echo$FULLPATH | sed-n's/^\(.\/\)*\(.\\)/\2/p')
第一个组捕获路径中的任何目录。这是丢弃的

第二个组捕获是最后一个斜杠(
/
)后面的文本。这是退回的

示例:

echo”/test/file.txt“| sed-n的/^\(.*\/\)*\(.*\)/\2/p”
file.txt
echo“/test/asd/asd/entrypoint.sh”| sed-n's/^\(.*\/\)*\(.*\)/\2/p'
entrypoint.sh
echo“/test/asd/asd/default.json”| sed-n的/^\(.*\/\)*(.*\)/\2/p'
default.json

和它的朋友dirname。如果您展示一个使用问题中提供的详细信息的工作示例,那就太好了。我从来没有听说过basename,我很高兴现在知道了,但我希望得到一些sed正则表达式的帮助。我怎么会不知道呢?!?这是一个非常方便的特性。非常感谢。使用
find/path-name“*.txt”-printf“%h\n”
find /path -name "*.txt" -printf "%f\n"
    path="parentdir2/parentdir1/parentdir0/dir/FileName"
    name=${path##/*}