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)
您可以使用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)