2009-07-25 94 views
8

我是新来的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' 

很抱歉的混乱。我原来的问题刚刚涵盖了我想要做的第一部分。

2日编辑: 这里就是我想出来的:

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

这不是完全是我想虽然。我不想将目标目录设置为shell变量,而是想要更改第一个sed操作,以便它仅在每行上的“ - >”之前更改cp输出,以便我仍然将cp输出的第二部分输出为与另一个'-e'一起操作。

3日编辑: 使用我还没有想通了这一点只有SED正则表达式的还,但下面不会使用Perl的作业:

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

我想做到这一点在SED虽然。

回答

7

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

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

,或者稍微更清晰,

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

为什么不使用basename呢?

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

和它的朋友,dirname。如果您展示了一个使用问题中提供的详细信息的工作示例,那将会很棒。 – 2009-07-25 02:32:06

+0

我从来没有听说过基地名称,我很高兴我现在知道它,但我希望有一些sed正则表达式的帮助。 – 2009-07-25 04:47:17

0
find /mydir | awk -F'/' '{print $NF}' 
8

无需外部工具,如果使用GNU发现

find /path -name "*.txt" -printf "%f\n" 
-2
path="parentdir2/parentdir1/parentdir0/dir/FileName" 
    name=${path##/*}