Bash файлы фильтров не соответствуют указанному шаблону c - PullRequest
0 голосов
/ 03 мая 2020

В моем скрипте bash мне нужно l oop указанную папку c и исключить все файлы, которые not содержат указанную строку c, например

. << current directory
db/abc.sql
db/def_something.sql

Должен вернуть только дБ / ab c. sql

Я могу l oop файлы, которые содержат что-то , но я не могу создайте противоположное, которое возвращает просто db / ab c. sql.

Это фильтр для что-то .. как я могу перечислить файлы, которые не содержат что-то ?

for file in ls ./db/*_something.sql;
do
  echo $file
done

В качестве возврата мне нужен полный путь, потому что нужно выполнить некоторую операцию с содержимым файла.

Ответы [ 3 ]

1 голос
/ 03 мая 2020

Я думаю, вам нужно:

ls -1 $PWD/db/*.sql | grep -v "_something.sql$"

, где $ PWD позволяет получить полный путь к файлу, 'db' - это ваш относительный подкаталог, '*. sql' - первый фильтр, который позволяет удалить имена файлов, отличные от необходимых, например, * .txt, и grep с помощью -v позволяет удалить имена файлов указанного шаблона, здесь: заканчивая '_something. sql'.

1 голос
/ 03 мая 2020

Попробуйте

for file in !(*something.sql); do echo ${file}; done;

Демо:

$ls -1
abc.sql
def_something.sql
$for file in !(*something.sql); do echo ${file}; done; 
abc.sql
$


0 голосов
/ 03 мая 2020

Для этого вам не нужен l oop.
Вы просто хотите find все файлы, кроме соответствующих шаблону c, поэтому:

$ find db -type f ! -name "*something.sql"
db/abc.sql

где:

  • db: ваш путь к поиску
  • -type f: обычные файлы (в результатах поиска каталог ommit)
  • '!' : отменить следующий тест
  • -name "pattern": очевидный
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...