32

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

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

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

Помогите?

5 ответов5

42

В аскубунту-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 для подробного объяснения.

Источник

10

Решение

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 .) {} Должен предшествовать индикатор конца опций: -- .

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 я хотел, чтобы они попали.

1

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

1

Мой однострочник - это работает на 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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .