如果我用for循环迭代一个目录,如何只回显文件的文件名呢?
for filename in /home/user/*
do
echo $filename
done;
将使用文件名拉出完整路径。我只想要文件名。
答案 0 :(得分:131)
如果您想要原生bash
解决方案
for file in /home/user/*; do
echo “${file##*/}”
done
以上使用参数扩展,它是shell的原生,不需要调用外部二进制文件,例如basename
但是,我建议您使用find
find /home/user -type f -printf "%f\n"
答案 1 :(得分:38)
只需使用basename
:
echo `basename "$filename"`
如果$ filename包含例如,则需要引号空格。
答案 2 :(得分:13)
使用basename
:
echo $(basename /foo/bar/stuff)
答案 3 :(得分:3)
另一种方法是在读取目录中的文件列表时使用ls
,以便为您提供所需的内容,即“仅文件名”。与读取完整文件路径然后在for循环的主体中提取“文件名”组件相反。
以下示例与您的原始照片相同:
for filename in $(ls /home/user/)
do
echo $filename
done;
如果您在与文件相同的目录中运行脚本,那么它将变成:
for filename in $(ls)
do
echo $filename
done;
答案 4 :(得分:0)
如果只需要文件名:
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
命令的更多信息,请参见here。
答案 5 :(得分:0)
您可以使用上面所说的SiegeX,或者如果您对学习/使用参数扩展不感兴趣,则可以使用:
for filename in $(ls /home/user/);
do
echo $filename
done;