是否可以从`ls`命令中删除文件夹前缀

рüф*_*ффп 12 ls shell bash directory

我在一个 bash 脚本中,我想获取所有文件的列表(比如所有 jar 文件)。我执行命令ls -1 lib/*.jar并得到输出:

lib/mylib_1.jar
lib/mylib_2.jar
...
Run Code Online (Sandbox Code Playgroud)

是否有任何选项可以提供以下输出:

mylib_1.jar
mylib_2.jar
...
Run Code Online (Sandbox Code Playgroud)

cd lib之前制作不是一个选项,因为我处于循环中并且需要在父文件夹中才能在循环内执行我想要执行的操作。

我试图通过键入来查找信息,man ls但没有找到任何解决方案。

使用另一个命令的解决方案会很好,只要我可以将其通过管道传输到我的ls命令或自给自足。

Jos*_*lly 19

取而代之的解析LS你应该使用find来代替。然后您还可以basename对每个文件执行以去除前导目录:

find lib/ -name '*.jar' -exec basename {} \;
Run Code Online (Sandbox Code Playgroud)

  • 另请参阅“-maxdepth”选项。 (4认同)

Gra*_*eme 14

使用 GNUfind不需要basename为每个文件都运行,这会快得多(特别是如果有很多文件):

find lib -name '*.jar' -printf '%P\n'
Run Code Online (Sandbox Code Playgroud)


don*_*l24 11

怎么样(cd lib && echo *.jar),假设文件名中没有空格或特殊字符。父脚本永远不会更改目录。


ter*_*don 5

正如 Josh Jolly 在他的回答中所说,你永远不应该 parse ls,而是在他的回答中使用这种方法。不过,这里有一个awk从文件名中删除路径的解决方案,只是不要将它与 ls 一起使用:

find . | awk -F'/' '{print $NF}'
Run Code Online (Sandbox Code Playgroud)

-F'/'套字段分隔符/,这意味着最后一个字段,$NF将是文件名。