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

Mec*_*ash 87 bash shell

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

for filename in /home/user/*
do
  echo $filename
done;
Run Code Online (Sandbox Code Playgroud)

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

Sie*_*geX 144

如果您想要原生bash解决方案

for file in /home/user/*; do
  echo "${file##*/}"
done
Run Code Online (Sandbox Code Playgroud)

以上使用参数扩展,它是shell的原生,不需要调用外部二进制文件,如basename

但是,我可以建议使用 find

find /home/user -type f -printf "%f\n"
Run Code Online (Sandbox Code Playgroud)

  • 好答案.对于那些有兴趣了解更多有关参数扩展的人:http://wiki.bash-hackers.org/syntax/pe#substring_removal (8认同)
  • echo "${file##*/}" 返回空字符串 (3认同)
  • -printf:未知的主要或运营商 (2认同)
  • 考虑将“ $ {file ## * /}”更改为“ $ {file ## * /}”`,以支持带空格的文件名,例如“带spaces.txt的我的文件名”。 (2认同)

Sea*_*ght 44

只需使用basename:

echo `basename "$filename"`
Run Code Online (Sandbox Code Playgroud)

如果$ filename包含例如空格,则需要引号.

  • 顺便说一下,``已被弃用.最好像Oli一样使用`$()` (5认同)
  • 更好地使用参数扩展,不需要调用外部二进制文件. (2认同)

Oli*_*rth 15

用途basename:

echo $(basename /foo/bar/stuff)
Run Code Online (Sandbox Code Playgroud)


rya*_*yan 5

另一种方法是ls在读取目录中的文件列表时使用,以提供所需的内容,即“仅文件名”。与读取完整文件路径然后在for循环的主体中提取“文件名”组件相反。

以下是原始示例的示例:

for filename in $(ls /home/user/)
do
  echo $filename
done;
Run Code Online (Sandbox Code Playgroud)

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

for filename in $(ls)
do
  echo $filename
done;
Run Code Online (Sandbox Code Playgroud)