列出目录中具有 .bar 扩展名但不具有 .foo.bar 扩展名的所有文件

发布于 2025-01-01 12:54:04 字数 179 浏览 1 评论 0原文

我想使用 ls 命令列出目录 a 中具有 .bar 扩展名但不具有 .foo.bar 扩展名的所有文件。以下内容选取了我不想要的 .foo.bar 文件

ls -l some/path/*.js

一定很简单。我只需要一个 AND 和 NOT 在那里。

I want to use the ls command to list all files in directory a with .bar extension but not .foo.bar extension. The following picks up .foo.bar files which I don't want

ls -l some/path/*.js

Must be simple. I just need an AND and NOT in there somehow.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

辞慾 2025-01-08 12:54:05

我知道您问如何在 bash 中执行此操作,但在 zsh 中您可以这样做

ls -l *.bar~*.foo.bar

并且您将获得所有未命名为 .foo.bar 的 .bar 文件。我想这是转向 zsh另一个原因:)

I know you asked how to do this in bash, but in zsh you could do

ls -l *.bar~*.foo.bar

And you would get all .bar files that are not named .foo.bar. I guess it's another reason to move to zsh :)

嘿嘿嘿 2025-01-08 12:54:05

如果您的请求是匹配 ab.js 和 cd.js 但不匹配 ef.tk.js,那么您可以使用以下代码。它解决了两个问题:

  • 路径或文件名中的空格没有问题(例如:文件位于“/var/tmp/my dir”中)
  • 路径名中的点没有问题(例如:文件位于/var/tmp/中) my.dir)

如果“DIR”是您要查找文件的目录,“EXT”是您尝试匹配的模式,请使用:

find DIR  -regex '.*/[^./]*\.PAT' -print0 | xargs -0 -r ls -l

例如,如果 DIR 是“/var/tmp”且 PAT 是“js” ' (对于 *.js):

find /var/tmp -regex '.*/[^./]*\.js' -print0 | xargs -0 -r ls -l

如果目标目录是“/var/tmp/my dir”,则此解决方案有效(不要忘记将目录放在引号内或转义空格)

如果您有很多文件,您可以运行进入命令行长度限制。那么您可能会考虑使用“xargs -0 -L XXX ls -l”,这样每次调用 ls 将仅针对 XXX 最大文件(例如,对 XXX 使用 500)。

If your request is to match ab.js and cd.js but not ef.tk.js, then you can use the following code. It solves 2 problems:

  • no problem with space in the path or the filenames (ex: files are in '/var/tmp/my dir')
  • no problem with dots in the path name (ex: files are in /var/tmp/my.dir)

If 'DIR' is the directory where you want to find your files, and 'EXT' is the pattern you try to match, use:

find DIR  -regex '.*/[^./]*\.PAT' -print0 | xargs -0 -r ls -l

For example, if DIR is '/var/tmp' and PAT is 'js' (for *.js) :

find /var/tmp -regex '.*/[^./]*\.js' -print0 | xargs -0 -r ls -l

This solution works if the target directory is '/var/tmp/my dir' (don't forget to put the directory inside quotes then or escape the space)

If you have many files, you may run into command-line length limitation. Then you might consider using 'xargs -0 -L XXX ls -l' instead, so each invokation of ls will be only with XXX max files (eg use 500 for XXX).

一念一轮回 2025-01-08 12:54:04

使用 bash 路径名扩展和 [ 模式匹配,您可以编写:

ls -l some/path/*[!(.foo)].bar

Using bash pathname expansion with [ pattern matching, you can write:

ls -l some/path/*[!(.foo)].bar
末が日狂欢 2025-01-08 12:54:04
find -name '*.bar' -not -name '*.foo.bar'
find -name '*.bar' -not -name '*.foo.bar'
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文