Як перенести файли з вкладених підкаталогів в іншу папку ubuntu? (Спроба зняти багато папок)


36

Як перенести файли, а не каталоги в іншу папку / батьківську папку?

У мене надзвичайно потворна структура папок, де деякі файли .mp3 закопані на 6 рівнів глибоко в підпапці.

Я хочу в кінцевому підсумку зі всіма файлами (здебільшого .mp3, але не всіма) в одному каталозі, без підкаталогів, за допомогою Ubuntu.

Допомога?

Відповіді:


48

У askubuntu-QA є чудова відповідь .

Для цього відкрийте термінал і виконайте цю команду:

mv  -v ~/Downloads/* ~/Videos/

Він перемістить усі файли та папки із папки "Завантаження" у папку "Відео".


Щоб перемістити всі файли, але не папки:

Але якщо вам цікаво перемістити всі файли (але не папки) з папки "Завантаження" у папку "Відео", скористайтеся цією командою

find ~/Downloads/ -type f -print0 | xargs -0 mv -t ~/Videos

Щоб переміщувати лише файли з папок Завантажити, але не з підпапок:

Якщо ви хочете перемістити всі файли з папки "Завантаження", але не будь-які файли в папках у папці "Завантажити", скористайтеся цією командою:

find ~/Downloads/ -maxdepth 1 -type f -print0 | xargs -0 mv -t ~/Videos

тут -maxdepthпараметр вказує, як слід спробувати глибоке знаходження, 1означає лише каталог, вказаний у команді find. Ви можете спробувати використовувати 2, 3щоб переглянути.

Детальне пояснення див. У розділі пошуку Ubuntu для пошуку .

Джерело


Якщо я хочу зробити це скопіювати всі файли в папку, мені просто доведеться змінити mv на cp? Я новачок у Linux
Neoryder

13

Рішення

find /src/dir -type f -exec mv --backup=numbered -t /dst/dir {} +

Команда знайде всі звичайні файли в розділі /src/dir(включаючи всі підкаталоги) і перемістить їх до програми /dst/dirза допомогою команди mv. Просто замініть каталоги своїми. Файли з однаковими іменами будуть перейменовані автоматично.

Вибір файлів для переміщення

Якщо ви хочете перемістити лише MP3-файли, додайте -iname "*.mp3"опцію до findкоманди після -type f.

Порівняння відповіді c0dev

Лише друга команда у відповіді c0dev відповідає на питання. Нижче - як вона порівнюється з цією відповіддю. Пункти 3. і 4. можна вирішити в іншій відповіді так само, як і тут.

  1. За винятком mvрішення з -exec +не потрібно викликати додаткову команду на зразок xargsабо parallelпередавати імена файлів двічі.
  2. Інша відповідь мовчки перезапише файли з однаковою назвою. Тут файли будуть автоматично перейменовані завдяки опції --backup=numbered. На жаль, ці резервні копії з подібним суфіксом ~3~будуть приховані в більшості файлів, що управляються за замовчуванням. На жаль, mvце не дозволяє змінювати суфікс, але його можна легко обробити додатковими командами. Це розширення GNU.
  3. На противагу -print0 -exec command {} +є частиною стандартів IEEE Std 1003.1 (POSIX), ISO / IEC 9945 та Єдиних специфікацій UNIX. Таким чином, він повинен бути більш портативним. Див. IEEE Std 1003.1, видання 2004 р. , IEEE Std 1003.1, видання 2013 р. Та 0000243: Додати "print0 "у" знайти " . Але в будь-якому разі необхідний -tперемикач mv- це розширення GNU, тому вся команда не переноситься між системами POSIX.

Примітка: У разі findматиме можливість виробляти шляхи , що починаються з -(я не знаю ні одного такого здійснення findна даний момент.) {}Повинен передувати індикатор кінця-опцій: --.


Помилка: знайдіть: відсутній аргумент до `-exec '
Кріс

@Chris: Ви маєте рацію, здається, це {}має бути як останній аргумент. Виправлено.
пабук

@Chris: Це працює зараз, як ти хотів? Якщо так, ви, ймовірно, можете прийняти відповідь, щоб ваше запитання не відображалось як "невирішене".
пабук

Це те, що я запускаю, і отримую помилки, не знайдені каталогів:
Кріс

що я працюю: clstal @ clap: ~ $ ls 1st script.R Firefox_wallpaper.png part1vidproj zotero pdf manager Desktop mozilla.pdf Фотографії Документи батьків Відеокліпи clstal @ clap: ~ $ find / source / directory -type f -exec mv -t / призначення / каталог {} + знайти: `/ source / directory ': Немає такого файлу чи каталогу
Chris

2

На жаль, я не маю достатньо високої репутації, щоб коментувати помічене рішення. Однак я хотів попередити інших щодо проблеми, з якою я стикався. Це досить любительсько; однак, коли ви робите кілька речей, спочатку це може не прийти в голову. Сподіваємось, це допоможе іншим.

Проблема

Варіанти наступного повідомлення були надані після ініціювання команди. Потім команда створює кілька файлів.

mv: `/data/share/docs/src/dir/filename.ext' and `/data/share/docs/src/dst/filename.ext' are the same file

Причина

/srcЄ батьком /dst(наприклад /src/../dst/).

Рішення

Хоча може бути і краще рішення, я просто перемістив файли у тимчасовий каталог за межами мого /srcі потім перезапустив команду, щоб розмістити їх назад у /src/../dstкаталозі, в якому я хотів, щоб вони закінчилися.


2

Мій однолінійний - це працює на Macs, але також повинен працювати на будь-якому * nix. Почніть з батьківського каталогу.

# Move files to parent and delete empty folders
find . -not -type d -print0 | xargs -0J % mv -f % . ; find . -type d -depth -print0 | xargs -0 rm -rf

У першій частині переміщується все з усіх папок у фактичну папку, звідки ви стереете команду; друга частина перевіряє, чи підкаталоги порожні (тепер вони повинні :-) та видаляє їх, щоб у вас вийшло все, що не має підкаталів.


(1) Поясніть, будь ласка, що робить Ваша відповідь та будь-які її переваги перед іншими відповідями (які дуже схожі). Будь ласка, не відповідайте на коментарі; відредагуйте  свою відповідь, щоб зробити її більш зрозумілою та повною. (2) Зауважте, що -notоператор нестандартний, тому ваша команда менш портативна, ніж інші.
Скотт

знайти. -не -тип d -принт0 | xargs -0J% mv -f%. ; знайти. -типу d -depth -принт0 | xargs -0 rm -rf Я запустив цю команду в папку, і вона видалила підпапки, папку, в якій я знаходився, а потім перейшла до батьківської папки. На щастя, я спостерігав за своїм файловим менеджером і мені вдалося зупинити команду, і вона була запущена в тестовій папці.
Буде чи

1

Відкрийте термінал, cd до своєї папки з файлами та запустіть, find . -mindepth 2 -type f -print -exec mv {} . \; щоб перемістити всі файли з цих підкаталогів у поточний.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.