Answers:
如果您想要本机bash
解决方案
for file in /home/user/*; do
echo "${file##*/}"
done
上面使用了Shell固有的Parameter Expansion,不需要调用外部二进制文件,例如basename
但是,我可能建议仅使用 find
find /home/user -type f -printf "%f\n"
${file##*/}
为"${file##*/}"
支持带空格的文件名,例如“带空格.txt的我的文件名”。
只需使用basename
:
echo `basename "$filename"`
如果$ filename包含空格,则需要使用引号。
$()
像奥利那样
/test 1
,basename $(pwd)
输出:test
。在OS X和Ubuntu Server(14.04)上进行了测试。@SiegeX建议使用本机bash解决方案对我有用。
basename "$(pwd)"
代替。
$PWD
而不是运行命令。
用途basename
:
echo $(basename /foo/bar/stuff)
echo
?basename
已经打印了结果。echo
如果不引用subshell,甚至可能会破坏结果。示例:echo $(basename path/with\ \ spaces)
打印不正确with spaces
(仅一个空格)。
另一种方法是ls
在读取目录中的文件列表时使用,以便为您提供所需的内容,即“仅文件名”。与读取完整文件路径然后在for循环的主体中提取“文件名”组件相反。
以下是原始示例的示例:
for filename in $(ls /home/user/)
do
echo $filename
done;
如果您在与文件相同的目录中运行脚本,那么它将变成:
for filename in $(ls)
do
echo $filename
done;
ls
包括*
通常不进行扩展的任何点文件。此外for f in $(...) ...
,如果任何文件名包含空格,除非你设置IFS,可如果有文件名包含水珠字符,除非你设置-f / -o noglob,并根据系统或壳失败失败echo
,如果任何文件名是连字符+字母或包含反斜杠可能会失败。OTOH ls -1 /path/to/dir
本身就可靠地将每个文件名打印在一行上,以点文件的差异为模。