Запустить команду из переменных в скрипте оболочки - PullRequest
0 голосов
/ 30 июня 2010

Я написал этот фрагмент кода для сканирования каталога на наличие файлов, более новых, чем эталонный файл, при исключении определенных подкаталогов.

#!/bin/bash

dateMarker="date.marker"
fileDate=$(date +%Y%m%d)
excludedDirs=('./foo/bar' './foo/baz' './bar/baz')
excludedDirsNum=${#excludedDirs[@]}

for (( i=0; i < $excludedDirsNum; i++)); do
    myExcludes=${myExcludes}" ! -wholename '"${excludedDirs[${i}]}"*'"
done

find ./*/ -type f -newer $dateMarker $myExcludes > ${fileDate}.changed.files

Однако исключения просто игнорируются.Когда я «echo $ myExclude», он выглядит просто отлично, и, кроме того, скрипт ведет себя так, как задумано, если я заменю «$ myExclude» в последней строке выводом команды echo.Я предполагаю, что это какая-то ошибка цитирования / экранирования, но я не смог ее устранить.

Ответы [ 2 ]

1 голос
/ 30 июня 2010

Кажется, проблема с цитированием, попробуйте использовать массивы:

#!/bin/bash

dateMarker=date.marker
fileDate=$(date +%Y%m%d)
excludedDirs=('./foo/bar' './foo/baz' './bar/baz')
args=(find ./*/ -type f -newer "$dateMarker")
for dir in "${excludedDirs[@]}"
do
    args+=('!' -wholename "$dir")
done
"${args[@]}" > "$fileDate.changed.files"

Может быть, вам также нужно -prune:

args=(find ./*/)
for dir in "${excludedDirs[@]}"
do
    args+=('(' -wholename "$dir" -prune ')' -o)
done
args+=('(' -type f -newer "$dateMarker" -print ')')
0 голосов
/ 30 июня 2010

вам нужно myExcludes, чтобы оценить что-то вроде этого:

\ (-name foo / bar -o -name foo / baz -o -name bar / baz \)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...