从路径中获取文件名

4

我有一个名为file.txt的文件,其结构如下:

./a/b/c/sdsd.c
./sdf/sdf/wer/saf/poi.c
./asd/wer/asdf/kljl.c
./wer/asdfo/wer/asf/asdf/hj.c

我怎样从路径中获取仅包含c文件名的列表? 也就是说,我的输出将只包括c文件。
sdsd.c
poi.c
kljl.c
hj.c
5个回答

4
您可以使用awk轻松完成此操作。
设置字段分隔符FS="/",$NF会打印每个记录的最后一个字段。
awk 'BEGIN{FS="/"} {print $NF}' file.txt

或者

awk -F/ '{print $NF}' file.txt

或者你可以使用 cut 和 Unix 命令 rev 来做到这一点: rev file.txt | cut -d '/' -f1 | rev

不要忘记使用 awk '{print $NF}' FS=/awk '{$0=$NF}1' FS=/ - William Pursell

4
您可以使用basename命令:
basename /a/b/c/sdsd.c

这将为您提供sdsd.c文件。

要列出file.txt中的文件列表,可以执行以下操作:

while IFS= read -r line; do basename "$line"; done < file.txt

上面的 while 循环对于几种不同的输入会出现神秘错误。尝试使用包含反斜杠、以空格开头/结尾、包含空格、包含通配符等文件名进行测试。始终将循环写成 while IFS= read -r line,并且除非您有特定原因并理解后果,否则始终引用您的变量。 - Ed Morton
@EdMorton 很好的观点。我通常会引用变量,但忘记了IFS=部分。感谢您指出这一点。已更新答案。 - P.P
不要忘记使用“-r”选项来读取文件,否则你的脚本仍然会因为包含反斜杠的文件名而失败。 - Ed Morton

1
最简单的一个($NF 是当前行的最后一列):
awk -F/ '{print $NF}' file.txt

或者使用参数扩展

while read file; do echo "${file##*/}"; done < file.txt

或者使用 basenamebash 命令:

while read file; do basename "$file"; done < file.txt

输出

sdsd.c
poi.c
kljl.c
hj.c

添加了 参数扩展 文档链接。 - Gilles Quénot

1
Perl解决方案:
perl -F/ -ane 'print $F[@F-1]' your_file

你也可以使用sed命令:

sed 's/.*[/]//g' your_file

awk被OP标记了。但是为什么perl是bash的一部分呢? - Shiplu Mokaddim
Perl在单行模式下是一个shell工具,OP添加了Unix标签。 - Gilles Quénot

1
使用 sed 命令:
$ sed 's|.*/||g' file
sdsd.c
poi.c
kljl.c
hj.c

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接