对于目录中的文件,只有echo filename(无路径)

时间:2012-01-25 22:18:56

标签: bash shell

如果我用for循环迭代一个目录,如何只回显文件的文件名呢?

for filename in /home/user/*
do
  echo $filename
done;

将使用文件名拉出完整路径。我只想要文件名。

6 个答案:

答案 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;