2

我正在尝试在 Linux 中编写一个非常简单的脚本。
我先给你看代码:

#!/bin/bash
# The shell program uses glob constructs and ls
# to list all entries in testfiles, that have 2
# or more dots "." in their name.

ls -l /path/to/file/*.*.*

当我使用bash myscript命令运行此代码时,我得到类似:/path/to/file/file.with.three.dots

但我不想要这个。我只想显示文件名,而不是路径。
然后我尝试了:

ls -l *.*.*

但这次是向我显示文件,只有当我在 /path/to/file/ 中时。
如何设置路径,所以当从任何地方运行脚本时,它会输出 /path/to/file/ 中的文件名?

谢谢!

4

5 回答 5

7

basename path/to/file.b.c应该给你file.bc

但是重新阅读这个问题,我认为暂时cd的路径然后ls可能会更好:

(cd /path/to/file; ls -l *.*.*)
于 2013-02-06T04:04:44.607 回答
2

先上代码:

ls -l /path/to/file/*.*.* | awk -F '/' '{print $NF}'

现在解释:您列出您选择的文件,然后在其上使用 awk。开关 -F 将确定您用于拆分的字符(在这种情况下是 /)。然后你用 awk 打印“$NF”的值,这意味着“最后一个”。所以你有:/path/to/file/file.with.three.dots。拆分它,取最后一个(file.with.three.dots)并打印它(无论您的路径有多长/多深),并且无需更改您在文件系统上的当前位置。

我真的希望,我已经帮助了。

于 2013-02-06T07:37:18.277 回答
1

或者使用 find 命令。

$> find /path/to/file -printf %f\\n\\r
于 2014-11-26T09:09:22.413 回答
0

我建议坚持使用 basename。

ls -1 /path/to/file/*.*.* | while read path
do
    basename "$path"
done

最好在 $(ls /path/ )*中使用while read而不是for path ,因为如果您的路径碰巧在其中有空格,则 for 循环将分割路径。

于 2013-02-06T08:42:00.940 回答
0

我使用 Zapatero 技术的一种变体来捕获环境变量中的基本文件名。$1是命令行参数,根据我的脚本中的定义,它是相关文件名的完整路径。

请注意,如果完整路径包含通配符并返回多个结果,则 basename 变量将设置为“最后一个”匹配文件名,无论ls返回它们的顺序如何。

basename=$(ls -1 "$1" | while read path; do basename "$path"; done)
于 2014-10-24T17:21:06.777 回答