Вместо использования find
(которое хорошо работает) вы также можете использовать оболочку для этой цели.
Скажем, вы хотите, чтобы все файлы от $ PWD до $ DEST. Естественная попытка будет:
mv $PWD/* $DEST
Как это работает? Выражение «$ PWD / *» распространяется на имена всех файлов в этом каталоге. Эта функция оболочки называется "globbing". Последний аргумент mv
- это каталог назначения. Если у вас очень много файлов, это не сработает, потому что длина командной строки ограничена.
Но у решения есть проблема, что он пропускает точечные файлы - или «скрытые» файлы, файлы и каталоги, чье имя начинается с «.». Чтобы решить эту проблему, вы должны указать своей оболочке включить файлы точек при глобализации. Для этого используйте
shopt -s dotglob
при использовании bash
(и вы, вероятно, используете, bash
если вы не изменили по умолчанию). В этой оболочке приведенная выше команда будет работать и для точечных файлов.
Кроме того, у zsh
вас есть возможность выбрать это в каждом конкретном случае. Для этого нужно поставить
setopt extendedglob
в вашем .zshrc
. Тогда вы можете использовать
mv $PWD/*(D) $DEST
переместить все файлы, включая точечные файлы. («D» приводит к временному включению опции «GLOB_DOTS»).
Теперь первоначальный вопрос состоял в том, чтобы переместить все обычные файлы (не каталоги) из всех подкаталогов и их подкаталогов в один каталог. Это может быть достигнуто с помощью zsh
:
mv $PWD/**/*(D.)
Здесь выражение **/*
заставляет глобер рекурсивно спускаться в подкаталоги. В D
средства «также выбрать точечные файлы, а .
значит„выбрать только обычные файлы, а не каталоги“.