Регекс не участвуют здесь. Подстановочные знаки в bash (как и большинство других оболочек) соответствуют файлам только на основе имен файлов, а не на основе типа файла или других характеристик. Существует один способ сопоставления по типу: добавление /
в конце шаблона позволяет сопоставлять только каталоги или символические ссылки на каталоги. Таким образом, вы можете перемещать каталоги, затем перемещать то, что осталось, и перемещать каталоги назад - громоздко, но это работает.
tmp=$(TMPDIR=.. mktemp -d)
mv -- */ "$tmp"
mv -- * "$tmp"/other_directory/
mv "$tmp"/* .
rmdir "$tmp"
Стандартный способ сопоставления файлов по типу - это вызов find
.
find . -name . -o -type d -prune -o -exec sh -c 'mv "$@" "$0"' other_directory/ {} +
В zsh вы можете использовать glob определители для сопоставления файлов по типу. .
Отборочные матчи регулярных файлов; используется ^/
для сопоставления всех не-каталогов или -^/
для включения символических ссылок на каталоги.
mv -- *(.) other_directory/
В любой оболочке вы можете просто зацикливаться.
for x in *; do
if ! [ -d "$x" ]; then
mv -- "$x" other_directory/
fi
done