2015-05-21 1 views
-1

Я пытаюсь преобразовать рекурсивно через мои проекты dirs и subdirs и проверить синтаксис из командной строки php.bash command piping (и php): как проверить из командной строки каждый php-файл во всех поддиректорах?

Я могу перечислить все PHP файлы с помощью

find ./ -name '*.php' 

и я могу че проверить один PHP PHP как

php -l ./full/path/to/file/filename.php 

Но я не BLE, чтобы сделать их работающие вместе

find ./ -name '*.php' | php -l 

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

No syntax errors detected in - 

Как правильно трубы каждое имя файла для синтаксиса PHP проверки?

Не стесняйтесь отрегулировать заголовок и/или вопрос, мой английский не так хорош.

EDIT 1: Я гугле на StackOverflow и попытался это, но без успеха

$ find ./ -name '*.php' | xargs -0 "php -l" 
xargs: argument line too long 

EDIT 2: еще одну попытку

$ find ./ -name '*.php' -exec php -l 
find: missing argument to `-exec' 
+0

В чем разница между 'echo filename | php -l' и 'php -l filename'. Поскольку 'php -l' не использует стандартный ввод для чтения имен файлов, которые вы хотите обработать, первый не работает. – tripleee

ответ

1

Вы можете запустить команду PHP с каждым именем файла с,

find ./ -name '*.php' -exec php -l {} \; 
+0

Это работает, здорово! Можете ли вы расширить ответ, объясняющий, почему моя команда не работала? И что это означает синтаксис '{} |;'? – realtebo

+1

Это все на странице руководства. Вы пробовали читать 'man find'? Вкратце, '-exec' - это опция для запуска команды в файлах, которые' find' возвращает, и требуется перед вашей командой 'php'. '{}' является заполнителем для найденного имени файла, а escape-точка с запятой '\;' завершает команду. Ваша команда связывает имена файлов с ** стандартным входом ** php, который отличается от указанного в командной строке. – rojomoke

+1

@rojomoke Спасибо за дополнения. Что касается '\;', он завершает команду, но также запускает то, что приходит после '-exec', с каждым обнаружением' find'. Когда вы замените его на '\ +', он сделает список выводов и передаст их команде, например 'php -l file1.php file2.php ...'. –

1

Вы можете сделать это в петле оболочки:

for file in $(find ./ -name '*.php') 
do 
    php -l "${file}" 
done 
+0

Это работает, здорово! Можете ли вы расширить ответ, объясняющий, почему моя команда не работала? – realtebo

+0

Ehm .. как я могу написать многолинейную команду как одну строку? – realtebo

+0

Он должен быть разделен точкой с запятой, как 'для файла в $ (find ./ -name '* .php'); do php -l "$ {file}"; done'. См. Http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-7.html. –

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