我是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中这样做。
答案 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##/*}