Как лучше всего использовать расширение подстановочных знаков в bash, когда источник и место назначения похожи?

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

0
12.03.2020, 17:30
4 ответа

Лично я в ситуации, когда я собираюсь дать команду в интерактивном режиме, я бы просто выполнил mv *tut* tutorialsи ожидал получить ошибку «не могу двигаться». Это безвредно, и другие файлы и каталоги будут перемещены, как и ожидалось.

Статус выхода команды будет не -нулевым, сигнализируя об ошибке, но поскольку от этого ничего не зависит, его можно игнорировать.


В этом случае другие имена содержат тире передtut:

mv *-tut* tutorials

Или, если у вас также есть такие вещи, как python_tut, которые вы хотите переместить, также разрешите использовать подчеркивание:

mv *[_-]tut* tutorials

Или, чтобы потребовать любой дополнительный символ перед подстрокой tut(, которая tutorialsне имеет ),

mv *?tut* tutorials

Еще немного набрав и подумав, используя расширенный шаблон подстановки вbash:

shopt -s extglob
mv *tut!(orials*) tutorials

Этот второй вариант будет соответствовать всему, что содержит подстроку tut, за которой непосредственно не следует строка orials. Шаблон не будет соответствовать tutorials, а также пропустит tutorials1и т. д.

3
28.04.2021, 23:20

в вашем каталоге есть следующий файл

css-tricks/ django-tutorial/ good-tuts.txt js-tut/ tutorials/

команда

mv *tut*

будет израсходован bash как

mv django-tutorial/ good-tuts.txt js-tut/ tutorials/
  • Если последним аргументом mvявляется каталог, mvпереместит все аргументы в этот каталог.
  • поскольку последний аргумент — это каталог, в который вы хотите переместить файл, это подойдет.

Вы можете предварительно просмотреть изменение с помощью

echo mv *tut*

и посмотрите, является ли нужный каталог последним в командной строке.


Обратите внимание, что

mv *tut* tutorials/

расходуется как

mv django-tutorial/ good-tuts.txt js-tut/ tutorials/ tutorials/

, которые дают ошибку, которую вы видели.

Также обратите внимание, если у вас есть каталог tutorails.old/, трюк не сработает.

0
28.04.2021, 23:20

Вы также можете использоватьfind:

find. -type d -name "*tut*" -not -path "./tutorials" -exec mv -t "tutorials" {} +
1
28.04.2021, 23:20

Самый простой способ — переименовать целевой каталог tutorials/во что-то другое, не совпадающее с расширением имени файла, и переименовать его по своему желанию после выполнения перемещения.

0
28.04.2021, 23:20

Теги

Похожие вопросы