在 bash 中列出具有特定模式的所有子目录并执行命令

在 bash 中列出具有特定模式的所有子目录并执行命令

我有一个这样的目录:

.
./foo/.bar/bar/file.jpg
./foo/.bar/xyw/dummy.fil
./foo3/.bar/file.jpg
./foo3/.bar/bar/file.jpg
./fo/bar/file.jpg

我尝试列出所有包含该单词的子目录bar(不包括.bar)。然后在这些文件夹中执行命令(ls入门简单)。

我正在尝试使用 find,但我不知道如何在bar不采取任何措施的情况下进行过滤.bar:(

编辑

我已经测试了以下几种组合find

find . -d -name '*bar*' -exec {ls} 
find . -d | grep 'bar'

问题是我不知道如何过滤.bar和保留bar

答案1

您的第一个命令有两个问题find

  1. 您需要排除.bar目录。我们可以将 添加-not到我们的find来实现这一点。
  2. ls不会像那样工作。 find在你开始的同一目录中运行你的命令,所以你需要提供ls一个参数来{}传递 find 正在查看的目录。

其结果是:find . -type d -name '*bar*' -not -name '.bar*' -exec 'ls' '{}' ';'

您还需要用a 来终止-execfor ,但是 shell 会解释这一点,因此您必须将其放在引号中才能使其通过。find;find

我不确定您是否希望排除'.bar*''.bar',但我希望您可以自定义其中的一部分。从 Unix 的角度来看,无论哪种方式都可以。这取决于您的偏好和用例。

相关内容