Відповіді:
Видаліть {}
з mv
, mv
сприйме це як цільовий каталог, ігноруючи будь-які батьківські каталоги:
find -type f -exec mv {} collection/ \;
-maxdepth 1
допоможе.
find -type f -print0|xargs -0r mv -it colection/
Замість використання find
(що робить роботу добре), ви також можете використовувати оболонку для цього.
Скажіть, що ви хочете, щоб усі файли від $ PWD до $ DEST. Природною спробою було б:
mv $PWD/* $DEST
Як це працює? Вираз "$ PWD / *" розширюється на імена всіх файлів у цій директорії. Ця функція оболонки називається "глобулінг". Останній аргумент mv
- це каталог призначення. Якщо у вас дуже багато файлів, це не працюватиме, оскільки довжина командного рядка обмежена.
Але у вирішенні проблеми є те, що він опускає крапкові файли - або "приховані" файли, файли та каталоги, назва яких починається з ".". Щоб вирішити це, ви повинні сказати своїй оболонці, щоб вона включала точкові файли під час глобалізації. Для цього використовуйте
shopt -s dotglob
під час використання bash
(і ви, ймовірно, використовуєте, bash
якщо ви не змінили типовий режим). У цій оболонці вищевказана команда також буде працювати для точкових файлів.
З іншого боку, у zsh
вас є можливість вибирати це в кожному конкретному випадку. Для цього поставте
setopt extendedglob
у вашому .zshrc
. Тоді можна використовувати
mv $PWD/*(D) $DEST
щоб перемістити всі файли, включаючи dotfiles. ("D" впливає на тимчасове включення опції "GLOB_DOTS").
Тепер початкове питання полягав у переміщенні всіх звичайних файлів (а не каталогів) з усіх підкаталогів та їхніх підкаталогів в єдиний каталог. Це можна досягти за допомогою zsh
:
mv $PWD/**/*(D.)
Тут вираз **/*
змушує глобус спускатися рекурсивно в підкаталоги. В D
кошти «також вибрати точкові файли, а .
значить" вибрати тільки звичайні файли, а НЕ каталоги ".
find -type f -exec mv -t collection/ {} +
. Зверніться до сторінки керівництва про те, як це працює.