Começamos assim:
$ tree base/
base/
|-- ab
| '-- 12
| '-- 13
| '-- 37
| |-- file1.txt
| |-- file2.txt
| '-- file3.txt
|-- af
| '-- f3
| '-- 45
| '-- 9e
| |-- third1.txt
| '-- third2.txt
'-- cd
'-- b8
'-- e2
'-- a1
|-- other1.txt
'-- other52.txt
12 directories, 7 files
Primeiro, adicionamos os novos diretórios:
$ find base -type d -mindepth 4 -maxdepth 4 -exec mkdir {}/extra_folder ';'
Usamos -mindepth 4
e -maxdepth 4
para criar novos diretórios apenas no nível quatro. Sem o -mindepth 4
, obteríamos novos diretórios em níveis mais altos, e sem -maxdepth 4
, os novos diretórios seriam preenchidos com novos diretórios até que os nomes dos caminhos ficassem tão longos que find
não conseguisse mais criar.
O diretório extra_folder
é criado com mkdir
chamado de -exec
.
Agora temos
$ tree base/
base/
|-- ab
| '-- 12
| '-- 13
| '-- 37
| |-- extra_folder
| |-- file1.txt
| |-- file2.txt
| '-- file3.txt
|-- af
| '-- f3
| '-- 45
| '-- 9e
| |-- extra_folder
| |-- third1.txt
| '-- third2.txt
'-- cd
'-- b8
'-- e2
'-- a1
|-- extra_folder
|-- other1.txt
'-- other52.txt
15 directories, 7 files
Depois, moveremos os arquivos para baixo:
$ find base -maxdepth 5 -type f -execdir mv {} extra_folder ';'
Isso procura por qualquer arquivo regular dentro ou sob o diretório base
(suponho que existam arquivos apenas no nível mais baixo) que estão no nível cinco. Em seguida, ele usa -execdir
para executar o comando mv
no diretório em que o arquivo encontrado está localizado ( {}
será o nome base do arquivo encontrado).
Acabamos com
$ tree base/
base/
|-- ab
| '-- 12
| '-- 13
| '-- 37
| '-- extra_folder
| |-- file1.txt
| |-- file2.txt
| '-- file3.txt
|-- af
| '-- f3
| '-- 45
| '-- 9e
| '-- extra_folder
| |-- third1.txt
| '-- third2.txt
'-- cd
'-- b8
'-- e2
'-- a1
'-- extra_folder
|-- other1.txt
'-- other52.txt
15 directories, 7 files
De uma só vez:
$ find base -type f \
-execdir sh -c '[ ! -d "$1" ] && mkdir "$1"; mv "$2" "$1"' sh 'extra_folder' {} ';'
Isso localiza todos os arquivos regulares e os move para um diretório chamado extra_folder
, independentemente de onde eles devem começar. A execução desse comando várias vezes os moverá mais e mais para baixo.
O mini-script que é chamado por -execdir
:
[ ! -d "$1" ] && mkdir "$1"
mv "$2" "$1"
Isso será chamado com o nome da pasta como $1
e com o nome do arquivo como $2
e criará a pasta se ela não existir e, em seguida, moverá o arquivo para ela.