我是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)