Найти и запустить SQL-скрипт из командной строки

#mysql #bash #ubuntu #find

#mysql #bash #ubuntu #Найти

Вопрос:

я учусь использовать терминал с Linux. Я пытаюсь найти и запустить SQL-скрипт из командной строки.

До сих пор мне удавалось запускать SQL-скрипт из терминала с помощью:

 mysql -u username -p dbname < script.sql
 

а также найдите нужный мне файл с помощью:

 find /path/to/migrations/directory | sort -r | head -1
 

(Эта find команда находит самый последний sql-скрипт в пути)

Но я не мог понять, как объединить их, как:

 mysql -u username -p dbname < find /path/to/migrations/directory | sort -r | head -1
 

По сути, то, что я пытаюсь сделать, — это выполнить результат find sql-скрипта as.
Любая помощь будет оценена, спасибо 🙂

Ответ №1:

Чтобы развернуть команду file, вам нужно будет использовать $(), и поэтому команда будет:

 mysql -u username -p dbname < "$(find /path/to/migrations/directory | sort -r | head -1)"
 

Используйте кавычки для решения любых проблем, связанных с пробелами в расширении.

Комментарии:

1. спасибо за вашу помощь

2. Не беспокойтесь. Если ответ был полезен. Пожалуйста, поставьте лайк и примите ответ.

Ответ №2:

Чтобы понять буквально то, что вы спросили здесь, это было бы

 find /path/to/migrations/directory | sort -r | head -1 | mysql -u username -p dbname
 

Однако ваш подход прерывается, если SQL-скрипт, который вы ищете, либо НЕ является первым файлом (в текущей последовательности сортировки вашей оболочки) в вашем каталоге или ниже него, либо если есть подкаталоги directory , которые находятся в порядке сортировки перед вашим нужным скриптом.

Если ниже приведено несколько файлов directory , но только один является файлом sql, вы можете записать его как

 find /path/to/migrations/directory -type f -name '*.sql' -exec mysql -u username -p dbname {} ;
 

type f Гарантирует, что find не создает имена каталогов, а -name предложение ограничивает выбор именами, оканчивающимися на .sql

Но все же я бы добавил некоторые меры безопасности, чтобы избежать использования неподходящего SQL-скрипта. Например, вы могли бы сначала собрать все приведенные ниже файлы SQL directory , и если общее число больше 1, не запускать его, а вместо этого выдать сообщение в stderr со словами «не удается однозначно найти файл sql».

Комментарии:

1. такнс, мой каталог содержит только sql-скрипты, и я должен выбрать самый последний файл, оценил вашу помощь 🙂

2. Будьте осторожны, по предложению — поскольку ваш код — не находит самый последний файл, а первый в любом порядке find . Тогда, если у вас нет вложенных каталогов, мне интересно, зачем вы find вообще используете….. Возможно, вы получили бы лучшие ответы, если бы не только опубликовали свое текущее решение (что, конечно, было полезно сделать), но и точно определили, чего вы хотите достичь. Вы никогда раньше не упоминали «самый последний» критерий; если это важно, это аннулирует все ответы, и я предлагаю вам задать новый, более точный вопрос для вашей проблемы.