Как я могу объединить несколько каталогов в один
У меня есть несколько файлов в нескольких папках в одном каталоге, которые должны быть в одной папке. Есть ли командная строка, которая может помочь мне достичь этого?
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/).