如果我使用 for 循环迭代目录,如何仅回显文件的文件名?
for filename in /home/user/*
do
echo $filename
done;
将提取带有文件名的完整路径。我只想要文件名。
如果您想要原生
bash
解决方案
for file in /home/user/*; do
echo "${file##*/}"
done
上面使用了 Parameter Expansion,它是 shell 本机的,不需要调用外部二进制文件,例如
basename
但是,我可以建议只使用
find
find /home/user -type f -printf "%f\n"
只需使用
basename
:
echo `basename "$filename"`
如果
$filename
包含空格,则需要引号。
使用
basename
:
echo $(basename /foo/bar/stuff)
另一种方法是在读取目录中的文件列表时使用
ls
,以便为您提供您想要的内容,即“仅文件名”。与读取完整文件路径然后在 for 循环体中提取“文件名”部分相反。
下面的示例遵循您的原始示例:
for filename in $(ls /home/user/)
do
echo $filename
done;
如果您在与文件相同的目录中运行脚本,那么它就会变成:
for filename in $(ls)
do
echo $filename
done;
您可以使用 SiegeX 上面所说的,或者如果您对学习/使用参数扩展不感兴趣,您可以使用:
for filename in $(ls /home/user/);
do
echo $filename
done;
如果您只想要文件名:
for file in /home/user/*; do
f=$(echo "${file##*/}");
filename=$(echo $f| cut -d'.' -f 1); #file has extension, it return only filename
echo $filename
done
有关
cut
命令的更多信息,请参阅 此处。