Bash:我如何将这两个find命令合并为一个?

时间:2016-02-20 22:14:34

标签: bash find path-finding

我有

IFS=$'\n' read -d '' -ra files < <(find / -name "*.lproj" ! -iname "En*" ! -name "Base*" -o -name "*@3x.png" -o -name "*@3x.jpg" -o -name "*@3x.3ds" -o -path "/private/var/mobile/Containers/Bundle/Application/*/iTunesArtwork" -o -path "/private/var/mobile/Containers/Bundle/Application/*/*/*-568h@2x.png" -o -name "*~iphone*" ! -path "*/Kik.app/*" ! -path "*/fiverr.app/*" -o -path "/private/var/mobile/Containers/Data/*/*/Library/Caches" -o -path "/private/var/mobile/Documents/Flex/*.dat" -o -path "/private/var/mobile/Containers/Data/*/*/tmp/*" -o -path "/private/var/mobile/Documents/CyDown/*" -o -path "/private/var/db/stash/_.*/Applications/*/*-568h@2x.png" -o -path "/private/var/mobile/Containers/Data/*/*/Library/googleanalytics*" -o -path "/private/var/mobile/Containers/Data/*/*/Library/*FlurryFiles" -o -path "/private/var/mobile/Library/BatteryLife/Archives/*" -o -path "/private/var/tmp/*" -o -path "/private/var/lib/apt/lists/partial/*" -o -path "/private/var/mobile/Library/Logs/*" -o -path "/private/var/logs/*" -o -path "/private/var/root/.bash_history" -o -path "/private/var/mobile/Library/googleanalytics*"  -o -path "/private/var/mobile/Library/Logs/CrashReporter/DiagnosticLogs/*" -o -path "/private/var/mobile/Library/Caches/*"  ! -name "libactivator.plist" -o -iname "*.log" -o -iname "*.old" -o -iname "*.tmp")
du -hc "${files[@]}" 2>/dev/null | tail -1
 rm -r "${files[@]}" >/dev/null 2>&1

find / -path "/path/to/location" -name '*@2x.png' | sed 's/@2x//' | xargs rm

第一个查找指定了名称和路径的文件,计算总大小,然后删除它们。第二个查找以“@ 2x.png”结尾的所有文件,然后尝试从末尾删除“@ 2x.png”,然后删除该文件。

那么我如何将这两个命令组合成一个查找?

注意:有一些直接路径和名称(在第一个命令中)以“@ 2x.png”结尾,我不想删除“@ 2x.png”。所以我不能把它们组合在一起。例如(如果它们只是组合在一起)在第一个命令中有file@2x.png(意味着我想删除那个确切的名字)意味着sed将删除“@ 2x”,这不是我想要做的。

因为我不善于解释事情:第一个命令中的所有内容都应该指定确切的名称/路径,并且应该由sed修改。第二个命令中的所有内容都应该由sed修改,但我想只为两个命令运行一个find命令。

1 个答案:

答案 0 :(得分:2)

不是肯定我理解你要做的是什么,但如果你仍然希望数组在第一个命令中包含相同的东西,但是第二个中的文件

find / \( -name "*.lproj" ... -iname "*.tmp" \) -print -o -path "/path/to/location" -name '*@2x.png' -exec bash -c 'echo rm "${1/\@2x/}"' bash {} \;

注意:删除上面的echo以执行实际的rm。另外,请注意,如果文件符合添加到阵列删除的条件,那么它们将被添加到数组中但不会被删除,每个-o都是短路的,如果您想要相反的话,替换订单。