2016-02-20 3 views
1

У меня естьBash: как бы я объединил эти две команды поиска в одну?

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/*/*/*[email protected]" -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/*/*[email protected]" -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». Поэтому я не могу просто объединить их. например (если они были просто объединены вместе) с [email protected] в первой команде (что означает, что я хочу удалить это точное имя), это означает, что sed удалит «@ 2x», что не то, что я хочу сделать.

Потому что я плохо разбираюсь в вещах: все в первой команде должно иметь точное имя/путь, и не будет изменен sed. Все во второй команде должно быть изменено sed, но я хочу запустить только одну команду find для обоих.

ответ

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 будет короткое замыкание, если вы хотите обратное, замените заказ.