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


12

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

lib/mylib_1.jar
lib/mylib_2.jar
...

是否可以选择以下输出:

mylib_1.jar
mylib_2.jar
...

制作cd lib前是不是一种选择,因为我在一个循环中,并需要在为想在循环里做动作的父文件夹。

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

只要我可以将其传递给我的ls命令或自给自足,使用另一个命令的解决方案将是很好的。


这些文件的名称在做什么?您是将它们列出到终端,还是将它们传递给另一个程序或脚本(单独或作为列表)?处理此问题的正确方法取决于文件名的使用方式。
库萨兰达

想法是对多模块Java项目上的第三方库进行一些统计。我只是想列表,并作出sort和uniq后
рüффп

Answers:


19

而不是解析ls,您应该find改为使用。然后,您还可以basename在每个文件上执行以剥离前导目录:

find lib/ -name '*.jar' -exec basename {} \;

好的,这种方式对我来说也是完美的。
рüффп

3
另请参阅-maxdepth选项。

13

使用GNU find,不需要basename为每个文件都运行,这会更快(尤其是如果有很多文件):

find lib -name '*.jar' -printf '%P\n'

11

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


空格也不是问题。
terdon

这是一个好主意,可能是最快的选择。我会尽力printf '%s\n' *.jar将每个文件放在不同的行上。
Graeme 2014年

甚至printf '%s\0' *.jar消除空白问题(尽管这不是问题)。
Graeme 2014年

5

就像乔什·乔利(Josh Jolly)在回答中所说的那样,您永远不要解析ls,而应在回答中使用该方法。不过,这是一种awk从文件名中删除路径的解决方案,只是不要将其与ls一起使用:

find . | awk -F'/' '{print $NF}'

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


1

find也许是要走的路,但是如果您确实确实想(不想)lib/从剥离ls -1,则可以使用sed

$ ls -1 lib/*.jar | sed 's#^lib/##'
mylib_1.jar
mylib_2.jar

0

您可以使用带有--max-args(或更短的别名-n)参数的xargs来执行此操作:

ls --quoting-style=c -1 lib/*.jar | xargs --max-args 1 basename ls --quoting-style=c -1 lib/*.jar | xargs -n 1 basename

注意,我们--quoting-style=c用来确保文件名中的空格不会弄乱xargs。


我没注意到。谢谢!在另一个堆栈交换上找到了这个宝石。您可以使用--quoting-style = c将引号引入ls结果中。因此,完整的命令将是:`ls --quoting-style = c -1 lib / *。jar | xargs --max-args 1 basename`
yoni

-1

解决查询的另一种方法是使用列出所有文件ls -R。将ls命令的输出与grep结合使用,仅列出.jar文件。您可以使用以下命令对您的查询执行相同的操作:

ls -R lib | grep jar| grep -v jar*

如果存在一个也包含jar文件或名为“ list-of-jars.txt”的文件的子目录,这将严重失败。
Jules

grep -v jar *会使用名称与您引用的示例类似的文件过滤出结果。
joshi.mohit86

真正。它还会过滤掉所有预期的文件。现在,我再次查看它,我看不到任何情况下您建议的命令实际上都不会产生任何输出……
Jules 2014年

不,它将显示mylib_2.jar和过滤文件list-of-jars.txt
joshi.mohit86

不,不是。我刚试过 find development -name '*.jar' | wc -l-> 70ls -R development | grep jar| grep -v jar*->完全没有输出。
2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.