使用sed从完整路径获取文件名?
我是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/
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##/*}