仅列出包含两个特定文件的子目录

Tit*_*ito 6 scripting find ios

我正在使用 iPhone 的终端在 iOS 上运行以下代码,需要明确的是,此命令是在我越狱的 iphone 中使用名为 New Term 2 的超薄终端调整运行的:

cd /var/mobile/Library/Widgets
find . -maxdepth 3 -name 'index.html' -printf "%h\n"
Run Code Online (Sandbox Code Playgroud)

这将返回包含index.html. 我想知道如何添加另一个文件:(Config_extra.js如果存在,它将位于与 index.html 相同的文件夹中)以结果显示包含两个文件的文件夹的方式进行搜索

提前致谢

gue*_*t_7 11

你快到了;一旦find找到index.html文件,我们要求它通过去寻找Config_extra.js文件在同一目录中-execdir(由一些支持非POSIX选项find的实现,包括BSD-find这是iOS上),并在成功时,我们打印目录名称。

find . -maxdepth 3 -type f -name index.html -execdir test -f Config_extra.js \; -printf '%h\n'
Run Code Online (Sandbox Code Playgroud)

上面的命令以展开的方式编写:

find . -maxdepth 3 \
  -type f -name index.html \
  -execdir test -f Config_extra.js \; \
  -printf '%h\n' ;
Run Code Online (Sandbox Code Playgroud)

解决这个问题的另一种方法是perl使用很长一段时间以来作为File::Find标准和Perl核心的一部分的模块。意思是,如果你有perl你有File::Find

cfg='Config_extra.js'
perl -MFile::Find -le '
  find(
    sub {
      my $cfg = $ARGV[0];
      my $d = $File::Find::dir;
      -d && "$d/" =~ m|(?:.*/){3}| && $File::Find::prune++;
      -f && /^index\.html$/ && -f $cfg && print($d);
    }, 
    shift,
  )
' . "$cfg"
Run Code Online (Sandbox Code Playgroud)


pLu*_*umo 5

您可以使用find -exec

find . -maxdepth 3 -name 'index.html' -exec sh -c '
  [ -f "${f%/*}/Config_extra.js" ]' find-sh {} \; -printf "%h\n"
Run Code Online (Sandbox Code Playgroud)

如果你有一个很大的目录树,使用-exec ... +会表现得更好:

find . -maxdepth 3 -name 'index.html' -exec sh -c '
  for f do
    d="${f%/*}"
    [ -f "$d/Config_extra.js" ] && printf "%s\n" "$d"
  done' find-sh {} +
Run Code Online (Sandbox Code Playgroud)

或者,搜索目录:

find . -maxdepth 2 -type d -exec sh -c '
  [ -f "$1/index.html" ] && [ -f "$1/Config_extra.js" ]' find-sh {} \; -print
Run Code Online (Sandbox Code Playgroud)

或使用 -exec ... +

find . -maxdepth 2 -type d -exec sh -c '
  for d do
    [ -f "$d/index.html" ] && [ -f "$d/Config_extra.js" ] && printf "%s\n" "$d"
  done' find-sh {} +
Run Code Online (Sandbox Code Playgroud)