【问题标题】:How to ls --ignore on osx如何在 osx 上使用 ls --ignore
【发布时间】:2012-06-28 03:43:58
【问题描述】:

我正在尝试在 OSX 上执行以下操作:

ls -lR --ignore *.app

这样我就可以递归搜索所有文件夹除了 .app 文件夹。

不过,达尔文似乎没有 --ignore--hide 选项。

也许是一个脚本,可以递归地在一个文件夹深处搜索给定的集合,但由于输出的格式,我不确定我不能通过任何管道 ls -lR

./ROOT/Applications/Some_app:
drwxr-xr-x   3 admin  root  102 26 Jun 11:03 app-bundle.app  #<- WANT THIS
drwxr-xr-x@ 24 admin  root  816 26 Jun 11:24 folder          #<- WANT THIS

./ROOT/Applications/Some_app/app-bundle.app:                 #<- DON'T WANT
drwxr-xr-x  7 admin  root  238 26 Jun 11:03 Contents         #<- DON'T WANT
...

【问题讨论】:

    标签: macos bash ls


    【解决方案1】:

    使用find:

    find . -ls -name '*.app' -prune
    

    【讨论】:

    • 找到!! 羞愧地低下头就像一个魅力。谢谢(等待回复延迟)
    • 你的第二次迭代要好得多。
    • 想了想,还可以做的更简单。总是-ls。如果是应用程序,-prune。
    • find . -ls -name '*.app' -prune | sed -n 's/^[0-9]* *[0-9]* //p' 完美!
    • 玩了一段时间后,您只需要确保将最终的 / 离开搜索路径
    【解决方案2】:

    在 bash 中,您可以使用扩展通配符来排除模式。

    shopt -s extglob # this must be on its own line
    echo !(*.app) # match everything except for the given pattern
    

    如果您有 bash 版本 4 或更高版本,则可以使用 globstar 递归执行此操作。

    shopt -s globstar
    shopt -s extglob 
    echo **/!(*.app) 
    

    【讨论】:

    • @hoss - 仅在 bash v4 或更高版本上,使用 globstar。添加到答案中
    • 这是一个非常好的和优雅的解决方案。
    • 确实,很优雅。
    • osx 10.8.5 有 bash --version = 3.2.48。
    【解决方案3】:

    另一种方法是通过管道传递给 grep:

    ls | grep -v

    【讨论】:

    • 不确定这是否能解决手头的问题,即不想遍历递归列表中的 .app 目录。如果我使用 ls -R | grep -v ".app" 我最终会得到 all 文件 except 用于 .app 目录,但包括所有子文件和文件夹。
    • 如果终端很宽并且文件名很短,这将不起作用 - 它会排除大量与模式不匹配的文件。
    • 其实这是可以挽救的——使用1选项到ls强制每行一个文件
    猜你喜欢
    • 2020-05-31
    • 1970-01-01
    • 2013-02-23
    • 1970-01-01
    • 2018-12-11
    • 2011-09-10
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多