Как я могу объединить несколько каталогов в один

У меня есть несколько файлов в нескольких папках в одном каталоге, которые должны быть в одной папке. Есть ли командная строка, которая может помочь мне достичь этого?

5 ответов

Решение

С помощью find + xargs + mv:

find . -type f -print0 | xargs -0 -I file mv --backup=numbered file .

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

Пример результата на tmp папка с 1, 2 а также 3 подпапки, каждая из которых содержит 1.ext, 2.ext а также 3.ext файл:

ubuntu@ubuntu:~/tmp$ tree
.
├── 1
│   ├── 1.ext
│   ├── 2.ext
│   └── 3.ext
├── 2
│   ├── 1.ext
│   ├── 2.ext
│   └── 3.ext
└── 3
    ├── 1.ext
    ├── 2.ext
    └── 3.ext

3 directories, 9 files
ubuntu@ubuntu:~/tmp$ find . -type f -print0 | xargs -0 -I file mv --backup=numbered file .
ubuntu@ubuntu:~/tmp$ tree
.
├── 1
├── 1.ext
├── 1.ext.~1~
├── 1.ext.~2~
├── 2
├── 2.ext
├── 2.ext.~1~
├── 2.ext.~2~
├── 3
├── 3.ext
├── 3.ext.~1~
└── 3.ext.~2~

3 directories, 9 files

Если ваша структура каталогов выглядит

dir root

  • Дир А
    • подать
    • файл б
  • режиссёр Б
    • файл с
    • файл d

и так далее

Вы можете сделать простой

mv **/* .

переместить все файлы на глубине 1 в корневой каталог. Просто и элегантно!

Вы можете использовать команду:

find . -type f -execdir mv '{}' /parent-dir \;

man find

 -execdir utility [argument ...] ;
     The -execdir primary is identical to the -exec primary with the exception that 
     utility will be executed from the directory that holds the current
     file.  The filename substituted for the string ``{}'' is not qualified.

Вы можете сделать это используя find:

find . -type f -exec mv -i -t new_dir {} +

Сначала создайте каталог (mkdir new_dir), куда вы хотите переместить все файлы, здесь мы перемещаем все файлы в ./new_dir каталог.

  • find . -type f найдет все файлы во всех каталогах в текущем каталоге, поэтому вам нужно cd в каталог, который содержит все подкаталоги или вы можете использовать абсолютный путь, например ~/foo/bar

  • -exec предикат find выполнит mv команда, которая переместит все найденные файлы в new_dir каталог. Еще раз вы можете использовать абсолютный путь.

  • mv -i предложит вам перед перезаписью файла.

Если новый каталог находится в другом месте, используйте абсолютные пути:

find ~/path/to/dir -type f -exec mv -i -t ~/path/to/new_dir {} +
      find /path/to/root/directory -type f -exec mv {} /path/to/destination/folder/ \;

Давайте разберем команду и разберем каждую часть:

  • find: Команда, используемая для поиска файлов и каталогов в указанном месте.
  • /path/to/root/directory: замените это фактическим путем к вашему корневому каталогу, где расположены подкаталоги.
  • -type f: Указывает, что мы ищем обычные файлы (не каталоги).
  • -exec mv {} /path/to/destination/folder/ \;: Выполняет команду mv для каждого найденного файла ({}). Он перемещает (mv) каждый файл в указанную папку назначения (/path/to/destination/folder/).
Другие вопросы по тегам