Я пытаюсь собрать все файлы в текущем каталоге и все подкаталоги в один каталог. Я пытаюсь что-то вроде следующего
find -type f -exec mv {} collection/{} \;
вышеупомянутая команда не будет работать, потому что вторая {}
дает полный путь, как я могу собрать все файлы?
command-line
find
Кролик кролик
источник
источник
-maxdepth 1
поможет.find -type f -print0|xargs -0r mv -it colection/
Вместо использования
find
(которое хорошо работает) вы также можете использовать оболочку для этой цели.Скажем, вы хотите, чтобы все файлы от $ PWD до $ DEST. Естественная попытка будет:
Как это работает? Выражение «$ PWD / *» распространяется на имена всех файлов в этом каталоге. Эта функция оболочки называется "globbing". Последний аргумент
mv
- это каталог назначения. Если у вас очень много файлов, это не сработает, потому что длина командной строки ограничена.Но у решения есть проблема, что он пропускает точечные файлы - или «скрытые» файлы, файлы и каталоги, чье имя начинается с «.». Чтобы решить эту проблему, вы должны указать своей оболочке включить файлы точек при глобализации. Для этого используйте
при использовании
bash
(и вы, вероятно, используете,bash
если вы не изменили по умолчанию). В этой оболочке приведенная выше команда будет работать и для точечных файлов.Кроме того, у
zsh
вас есть возможность выбрать это в каждом конкретном случае. Для этого нужно поставитьв вашем
.zshrc
. Тогда вы можете использоватьпереместить все файлы, включая точечные файлы. («D» приводит к временному включению опции «GLOB_DOTS»).
Теперь первоначальный вопрос состоял в том, чтобы переместить все обычные файлы (не каталоги) из всех подкаталогов и их подкаталогов в один каталог. Это может быть достигнуто с помощью
zsh
:Здесь выражение
**/*
заставляет глобер рекурсивно спускаться в подкаталоги. ВD
средства «также выбрать точечные файлы, а.
значит„выбрать только обычные файлы, а не каталоги“.источник
find -type f -exec mv -t collection/ {} +
. Обратитесь к странице руководства о том, как это работает.