对于目录中的文件,仅回显文件名(无路径)

问题描述 投票:0回答:6

如果我使用 for 循环迭代目录,如何仅回显文件的文件名?

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

将提取带有文件名的完整路径。我只想要文件名。

bash shell
6个回答
210
投票

如果您想要原生

bash
解决方案

for file in /home/user/*; do
  echo "${file##*/}"
done

上面使用了 Parameter Expansion,它是 shell 本机的,不需要调用外部二进制文件,例如

basename

但是,我可以建议只使用

find

find /home/user -type f -printf "%f\n"

58
投票

只需使用

basename

echo `basename "$filename"`

如果

$filename
包含空格,则需要引号。


20
投票

使用

basename

echo $(basename /foo/bar/stuff)

12
投票

另一种方法是在读取目录中的文件列表时使用

ls
,以便为您提供您想要的内容,即“仅文件名”。与读取完整文件路径然后在 for 循环体中提取“文件名”部分相反。

下面的示例遵循您的原始示例:

for filename in $(ls /home/user/)
do
  echo $filename
done;

如果您在与文件相同的目录中运行脚本,那么它就会变成:

for filename in $(ls)
do
  echo $filename
done;

1
投票

您可以使用 SiegeX 上面所说的,或者如果您对学习/使用参数扩展不感兴趣,您可以使用:

for filename in $(ls /home/user/);
do
    echo $filename
done;

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
命令的更多信息,请参阅 此处

© www.soinside.com 2019 - 2024. All rights reserved.