Aqui está uma maneira de gerenciar diretórios sem subdiretórios .
Primeiro, ligue a globalização recursiva:
shopt -s globstar
Agora você pode globar recursivamente com **
. Você pode desativá-lo com shopt -u globstar
, mas ele será desativado da próxima vez que você abrir um shell.
Agora, no diretório pai de ambos os Copy
e Original
:
for d in Original/**/; do $(ls -lAq "$d" | grep -q '^d') || echo mv -vn -- "$d" Copy"${d/Original/}"; done
Remova echo
após o teste para mover realmente os diretórios (e seu conteúdo é claro - mv
não tem um sinalizador -r
)
Vamos tornar isso um pouco mais legível
shopt -s globstar
for d in Original/**/; do
$(ls -lAq "$d" | grep -q '^d') ||
echo mv -vn -- "$d" Copy"${d/Original/}"
done
Espere, eu acabei de analisar a saída de ls
? Sim, eu fiz. Mas acho que está tudo bem (!) Já que acho que posso confiar na consistência da saída nesse caso. Independentemente dos caracteres que um nome de arquivo contém, a saída de ls -l
no diretório em que o arquivo reside começará com uma cadeia que define seu tipo e permissões. Em ls -l
, todas as listagens de diretório começam com d
, por exemplo
drwxrwxr-x 26 zanna zanna 4096 Oct 5 19:57 playground
Mesmo novas linhas não estragam tudo isso, pois elas são exibidas como ?
(mesmo depois da canalização) se adicionarmos -q
.
$(ls -lAq "$d" | grep -q '^d')
verifica se o diretório possui alguns subdiretórios. Em vez de coletar a saída de grep
, coletamos o status de saída. Se o comando for bem sucedido, não fazemos nada, mas se falhar, nós mv
do diretório (usando o ||
ou operador, o que significa que, se o comando antes de ||
falhar, faça o seguinte).
Usamos a manipulação de strings para remover Original
, então os diretórios são copiados para os lugares certos em Copy
.
Aqui está o resultado:
$ tree
.
├── Copy
│ ├── Dir1
│ │ ├── Objects
│ │ └── Textures
│ ├── Dir2
│ │ ├── SubDir1
│ │ │ └── SubSubDir1
│ │ │ ├── Objects
│ │ │ └── Textures
│ │ └── SubDir2
│ │ ├── Objects
│ │ └── Textures
│ └── Dir3
│ ├── Objects
│ ├── SubDir1
│ │ ├── Objects
│ │ └── Textures
│ └── Textures
└── Original
├── Dir1
├── Dir2
│ ├── SubDir1
│ │ └── SubSubDir1
│ └── SubDir2
└── Dir3
└── SubDir1