2016-04-29 5 views
0

Я хочу 'git rm' собрать кучу файлов, найденных командой 'find'. Файлы должны иметь определенный суффикс. Я получил это:gbash 'git rm' несколько файлов, найденных командой 'find'

TEST_PATH='/usr/src' 

function main() { 
    for i in "[email protected]" 
    do 
     echo "current i = ${i}" 
     COMMAND='find $TEST_PATH -maxdepth 20 -name '*_${i}.txt' -exec git rm {} \;' 
     # COMMAND="$(find $TEST_PATH -maxdepth 20 name '*_${i}.txt' -print0 | xargs -0 -I{} cp {} .)" 
     # COMMAND="find $TEST_PATH -maxdepth 20 -name '*_${i}.txt' -exec cp {} . \;" 
     # COMMAND="find . '*.BUILD' | while read file; do echo "$file"; done \;" 
    done 

    echo "Running Command: $COMMAND" 
    $COMMAND 
} 

gbash::main "[email protected]" 

Забегая выдаст сообщение об ошибке, как это:

$ sh abc.sh 123 
current i = 123 
Running Command: find ../../src/python/servers/innertube/tests/ -maxdepth 20 -name "*_9421870.txt" -exec rm {}\; 
find: missing argument to `-exec' 

Я прочитал и перепробовал все решения на StackOverflow (см закомментирована код), но ни один не работает .. .

+1

Почему вы храните команду в переменной? [Я пытаюсь поместить команду в переменную, но сложные случаи всегда терпят неудачу!] (Http://mywiki.wooledge.org/BashFAQ/050). Просто выполните его нормально и отлаживайте, пишите что-то вроде 'echo git rm {} \;'. – fedorqui

ответ

1

Update

проблема заключается в том, что вы должны eval содержимое переменной, содержащей команду:

eval $COMMAND 

От man eval:

Eval утилита должна построить команду путем конкатенации аргументов вместе, разделяя каждый с <space> характером. Построенная команда должна быть прочитана и выполнена оболочкой.

Оригинальный ответ

Заменить {}\; с {} \; или {} +.

Прочтите страницу руководства для find. Действие используется в вашей команде документирована как:

-exec command ;

Выполнить команду; true, если возвращается 0. Все следующие аргументы> для поиска считаются аргументами команды до тех пор, пока не будет найден аргумент, состоящий из ;. Строка {} заменяется имя текущего обрабатываемого файла везде это происходит в аргументы команды ...

Таким образом, команда не удалась, поскольку {}\; последовательность интерпретируется как command.

+2

Но у него есть место в его команде. –

+0

@BenjaminW., Я уверен, что он этого не сделал. Кроме того, я вижу эту строку в своем сообщении: 'Running Command: find ../../src/python/servers/innertube/tests/ -maxdepth 20 -name" * _9421870.txt "-exec rm {} \;' , И я не вижу пробелов между '{}' и '\;' здесь. Возможно, на самом деле он может запускать другой сценарий, чем в вопросе. –

+0

@BenjaminW., Вы правы. Проблема заключалась в том, что он запускал команду как '$ COMMAND' вместо' eval $ COMMAND'. –

 Смежные вопросы

  • Нет связанных вопросов^_^