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本身就可靠地将每个文件名打印在一行上,以点文件的差异为模。