У меня есть несколько файлов в нескольких папках в одном каталоге, которые должны находиться в одной папке. Есть ли командная строка, которая может помочь мне в этом?
Используя 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
Можно сделать это использование 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 . -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.
Если Ваша структура каталогов похожа
корень dir
- dir
- файл d
dir B
, можно сделать простое
mv **/* .
для перемещения всех файлов в глубину 1 к корневому каталогу. Простой и Изящный!