Crie uma pasta “Foto” dentro de todos os diretórios recursivamente

Crie uma pasta “Foto” dentro de todos os diretórios recursivamente

Eu tenho um monte de pastas e quero percorrer todas essas pastas e em cada pasta criar outra pasta chamada "Foto"

F1
--F11
----F111
----F112
--F12

Eu quero ter:

F1
--Photo
--F11
----Photo
----F111
------Photo
----F112
------Photo
--F12
----Photo

Responder1

Você pode conseguir isso usando uma única findchamada.

find . -name 'Photo' -prune -o -type d -exec mkdir {}/Photo \;

A parte -name 'Photo' -prune -odiz para não recorrer a Photodiretórios existentes (e recém-criados): Se o arquivo (ou diretório) encontrado tiver o nome Photo, pare de processá-lo ( -prune). No outro caso ( -o), continue com os diretórios ( -type d) e execute ( -exec) o comando.

Responder2

Você poderia passar findos resultados para whileem vez de, forpois desta forma não será quebrado se os nomes dos arquivos tiverem espaços

Primeiro faça cd para o diretório F1e depois faça:

find -type d | while read dir ; do mkdir "$dir"/Photo ; done

Se o diretório existir, mkdirsimplesmente se recusará a criá-lo, então não há problema...

Se os nomes dos seus diretórios puderem conter novas linhas ou outras estranhezas exóticas, use isto, que pode lidar com nomes arbitrários:

find -type d -print0 | while IFS= read -r -d '' dir ; do mkdir "$dir"/Photo ; done

Obrigado a @terdon pela ajuda com isso :)

Responder3

No diretório logo acima de F1 execute este script:

O objetivo do script é evitar a criação de diretórios de fotos redundantes em diretórios de fotos.

Além disso, foi projetado para evitar a execução acidental de um local errado, como o diretório raiz do usuário, ao passo que ele não veria o F1diretório e criaria por engano centenas de diretórios de fotos nos palácios errados.

Além disso, minha intenção era criar um script fácil de seguir para que o usuário pudesse personalizá-lo.

#!/bin/bash

while IFS= read -r -d '' i;
do
    if [[ ! -d $i/Photo ]]; then
        # Filter to skip folders named Photo
        thisfolder="$(echo $i | sed "s/.*\///")"
        if [[ ! $thisfolder == "Photo" ]]; then
            mkdir "$i/Photo"
        fi
    fi
done < <(find F1 -type d -print0)

Script atualizado:

  • Alterou as letras minúsculas ppara photomaiúsculas.
  • Adicionado suporte para nomes de arquivos não-stander (com sugestões de Terdon).

Responder4

Se estiver usando o bash, você pode simplesmente executar:

shopt -s globstar
for d in **/; do mkdir -p "$d"/Photo; done

A globstaropção **corresponde a "todos os arquivos e 0 ou mais diretórios e subdiretórios". Em outras palavras, corresponde a tudo recursivamente. Por causa do /final, **/corresponderá a todos os diretórios e subdiretórios (sem arquivos). Portanto, $dirá iterar sobre todos os diretórios no diretório atual e seus subdiretórios e o Photosdiretório será criado em cada um deles.

A -pbandeira dos mkdirmeios:

  -p, --parents
          no error if existing, make parent directories as needed

Aqui, estou usando-o apenas para suprimir mensagens de erro se o diretório de destino já existir. Remova-o se quiser ver os erros.

Observe que isso não criará um Photosubdiretório em um diretório de destino que contenha umarquivochamada Foto. Você não especificou o que deve ser feito nesses casos e todas as outras respostas postadas até agora também têm essa limitação.

informação relacionada