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/null
with更安全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