Как переместить файлы из вложенных подкаталогов в другую папку в Ubuntu? (Пытается скинуть много подпапок)

36

Как переместить файлы, а не каталоги в другую папку / родительскую папку?

У меня очень уродливая структура папок с некоторыми файлами .mp3, скрытыми на 6 уровнях в подпапке.

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

Помогите?

Крис
источник

Ответы:

48

В аскубунту-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означает только каталог, указанный в команде поиска. Вы можете попробовать использовать 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на данный момент.) {}Должен предшествовать индикатор конца-опций: --.

pabouk
источник
Ошибка: найти: отсутствует аргумент `-exec '
Крис
@ Крис: Вы правы, похоже, {}это последний аргумент. Исправлено.
Пабук
@Chris: это работает сейчас, как вы хотели? Если да, вы, вероятно, можете принять ответ, чтобы ваш вопрос не отображался как «не решен».
Пабук
Это то, что я запускаю, и получаю ошибки, связанные с отсутствием каталога:
Крис
что я запускаю: clstal @ clap: ~ $ ls 1st script.R Firefox_wallpaper.png part1vidproj zotero pdf manager Рабочий стол mozilla.pdf Картинки Документы родительское видео clstal @ clap: ~ $ find / source / directory -type f -exec mv -t / destination / directory {} + find: `/ source / directory ': Нет такого файла или каталога
Крис
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каталог, в котором они хотели бы оказаться.

MackAltman
источник
2

Мой однострочник - это работает на Mac, но должно работать и на любом * 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

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

X-File
источник
(1) Пожалуйста, объясните, что делает ваш ответ, и какие преимущества он имеет по сравнению с другими ответами (которые очень похожи). Пожалуйста, не отвечайте в комментариях; отредактируйте  свой ответ, чтобы сделать его более понятным и полным. (2) Обратите внимание, что -notоператор нестандартный, поэтому ваша команда менее переносима, чем другие.
Скотт
находить . -не-тип d -print0 | xargs -0J% mv -f%. ; находить . -тип d -depth -print0 | xargs -0 rm -rf Я выполнил эту команду в папке, и она удалила вложенные папки, папку, в которой я находилась, а затем переместилась в родительскую папку. К счастью, я наблюдал за моим файловым менеджером и сумел остановить команду, и она была запущена в тестовой папке.
Будет
1

Откройте терминал, перейдите в вашу папку с файлами и запустите, find . -mindepth 2 -type f -print -exec mv {} . \; чтобы переместить все файлы из этих подкаталогов в текущий.

лев
источник