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

时间:2009-07-25 01:32:46

标签: 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

这是我想要的输出:

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操作,而不是将目标目录设置为shell变量,因此它只会在“ - >”之前更改cp输出。在每一行上,我仍然有cp输出的第二部分与另一个'-e'一起操作。

第3次编辑: 我还没有想到只使用sed正则表达式,但以下使用Perl完成了这项工作:

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

我想在sed中这样做。

6 个答案:

答案 0 :(得分:16)

为什么不使用basename?

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

答案 1 :(得分:9)

这样的事情可以解决问题:

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

或者,稍微清楚一点,

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

答案 2 :(得分:9)

如果使用GNU find

,则无需外部工具
find /path -name "*.txt" -printf "%f\n"

答案 3 :(得分:2)

我根据标题找到了一个问题:使用sed从全路径中获取文件名。 因此,使用sed,以下是对我有用的...

"Cannot save or export XML data.  The XML maps in this workbook are not exportable"

第一组捕获路径中的所有目录。这被丢弃了。

第二组捕获是最后一个斜杠(FILENAME=$(echo $FULLPATH | sed -n 's/^\(.*\/\)*\(.*\)/\2/p') )之后的文本。这将返回。

示例:

/

答案 4 :(得分:0)

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

答案 5 :(得分:-2)

    path="parentdir2/parentdir1/parentdir0/dir/FileName"
    name=${path##/*}