如何获取所有 xy 但不是 z/xy 的文件列表?

如何获取所有 xy 但不是 z/xy 的文件列表?

Settings.json我这台机器上有很多文件。

我使用以下方法获取所有这些人的列表:

find / -name "Settings.json" 2>&-

但其中一些位于以Api.例如:

/ClubApi/Settings.json
/CrmApi/Settings.json

我想将它们全部删除,除非它们属于以Api.我不能那样做。

我试过:

find / -name "Settings.json" 2>&- | xargs grep -v Api 

但它不适用于过滤Api路径。

我怎样才能做到这一点?

答案1

首先,不要养成这样的习惯关闭2>&-如果您想忽略错误,请使用标准错误流。将其重定向到/dev/nullwith更安​​全2>/dev/null。有些命令一旦尝试写入关闭的流但失败,就会终止。

参见例如

{ echo 'error' >&2 && echo 'output'; } 2>&-

(什么也不输出)与

{ echo 'error' >&2 && echo 'output'; } 2>/dev/null

(输出output)。


使用-path测试来避免您不想影响的文件:

LC_ALL=C find / -type f ! -path '*Api/Settings.json' -name 'Settings.json' -print

或者,*Api如果您甚至不想靠近它们,请完全避免这些目录:

LC_ALL=C find / -name '*Api' -prune -o -type f -name 'Settings.json' -print

谓词-prune从搜索树中“修剪”(切断、删除)一个分支,因此上面的find命令甚至永远不会进入任何名称匹配的目录*Api

-print将上述命令更改为-exec rm {} +实际删除文件。

答案2

由于您要执行删除操作,因此最佳做法是首先测试文件列表。

使用否定选项改善find结果-not -path

find / -type f (-not -path "*[Aa]pi*") -and -name "Settings.json"  2>/dev/null

滤波器find输出grep

find / -type f -name "Settings.json"  2>/dev/null | grep -v "[Aa]pi"

获得正确的列表后:

最简单的技巧是向命令添加-delete操作find

这是极其危险运行在/

find / -type f (-not -path "*[Aa]pi*") -and -name "Settings.json" -delete 2>/dev/null

更谨慎的删除命令rm$(calculated list)

rm $(find / -type f (-not -path "*[Aa]pi*") -and -name "Settings.json"  2>/dev/null)

答案3

我使用以下方法获取所有这些人的列表:...find …

您也可以只使用 shell 来执行此操作,而不是依赖 find:

#!/bin/bash
# To enable ** globbing
shopt -s globstar 

filename=Settings.json
for file in **/${filename} ; do
  if ! [[ "${file}" =~ Api/${filename}$ ]]; then
    # Do something, e.g. 
    # echo "${file}"
    # But beware! Files' and directories' names can contain newlines,
    # so I'd recommend either directly working on the file as you have it:
    # jq -r '.[0].command' < "${file}"
    # or printing it with the zero byte as terminator, instead of newline:
    # printf "%s\0", "${file}"
  fi
done

相关内容