#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
вообще используете….. Возможно, вы получили бы лучшие ответы, если бы не только опубликовали свое текущее решение (что, конечно, было полезно сделать), но и точно определили, чего вы хотите достичь. Вы никогда раньше не упоминали «самый последний» критерий; если это важно, это аннулирует все ответы, и я предлагаю вам задать новый, более точный вопрос для вашей проблемы.