Поиск каталогов с помощью find в bash с использованием списка исключений

теперь, прежде чем вы подумаете, «это было сделано раньше», пожалуйста, прочтите .

Как и большинство людей, пытающихся создать сценарий find bash, вы в конечном итоге жестко запрограммируете сценарий на однострочную команду, но в конечном итоге редактируете это в течение следующих месяцев / лет так часто, что вы хотите, чтобы в конце концов вы сделал это правильно с первого раза.

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

#!/bin/bash
BasePath="/home/adesso/baldar"
declare -a Iggy
Iggy=( "/cgi-bin" 
    "/tmp" 
    "/test" 
    "/html" 
    "/icons" )
IggySubdomains=$(printf ",%s" "${Iggy[@]}")
IggySubdomains=${IggySubdomains:1}
echo $IggySubdomains
exit 0

Теперь в конце вы получите / cgi-bin, / tmp, / test, / html, / icons Это доказывает, что концепция работает , но теперь, чтобы пойти немного дальше, мне нужно использовать find для поиска BasePath и поиска только на один уровень для всех подкаталогов и исключения списка подкаталогов в массиве ...

Если я напечатайте это вручную, это будет:

find /var/www/* \( -path '*/cgi-bin' -o -path '*/tmp' -o -path '*/test' -o -path '*/html' -o -path '*/icons' \) -prune -type d

И если я, возможно, захочу зациклиться на каждом подкаталоге и сделать то же самое ... Надеюсь, вы поняли мою мысль.

То, что я пытаюсь сделать, кажется возможным, но у меня небольшая проблема, printf ",% s" не любит, когда я использую все эти параметры find -path или -o. Означает ли это, что мне снова нужно использовать eval?

Я пытаюсь использовать здесь мощь bash, а не какой-то цикл for. Любой конструктивный вклад приветствуется.

6
задан Adesso 27 February 2015 в 22:07
поделиться