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

9

Eu tenho um monte de pastas e quero fazer um loop por todas as pastas e, em cada pasta, criar outra pasta chamada "Photo"

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

Eu quero ter:

F1
--Photo
--F11
----Photo
----F111
------Photo
----F112
------Photo
--F12
----Photo
    
por OOzy Pal 14.09.2016 / 10:08

5 respostas

8

No diretório logo acima da F1, execute este script:

O objetivo do script é evitar que diretórios de fotos redundantes sejam criados em diretórios de fotos.

Além disso, ele é projetado para evitar que seja executado acidentalmente em um local errado, como o diretório raiz do usuário, enquanto não veria o diretório F1 e criaria erroneamente centenas de diretórios de foto nos palácios incorretos.

Além disso, minha intenção era facilitar o acompanhamento do script 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 a minúscula p em photo para maiúscula.
  • Adicionado suporte para nomes de arquivos não stander (com sugestões de Terdon).
por L. D. James 14.09.2016 / 10:39
24

Você pode conseguir isso usando uma única chamada find .

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

A parte -name 'Photo' -prune -o diz para não recorrer a diretórios Photo 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.

    
por Melebius 14.09.2016 / 11:05
9

Você poderia passar find resultados para while em vez de for , já que dessa forma não quebrará se os nomes dos arquivos tiverem espaços

Primeiro cd para o diretório F1 , faça:

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

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

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

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

Obrigado ao @terdon por ajuda com isso:)

    
por Zanna 14.09.2016 / 10:50
5

O Python com os.walk pode fazer isso com bastante facilidade e em apenas algumas linhas de código

$ mkdir dir_one dir_two
$ mkdir dir_two/dir_three
$ python -c 'import os;[os.mkdir(r + "/Pictures") for r,d,f in os.walk(".")]'                 
$ tree
.
├── dir_one
│   └── Pictures
├── dir_two
│   ├── dir_three
│   │   └── Pictures
│   └── Pictures
└── Pictures

Explicação

Estamos lidando com este comando:      python -c 'import os; [os.mkdir (r + "/ Pictures") para r, d, f em os.walk (".")]'

Aqui, simplesmente chamamos o interpretador python com -c flag para especificar o comando que damos dentro de aspas simples. A função os.walk() nos permite percorrer recursivamente todos os subdiretórios, e para cada subdiretório (representado por r ), criamos a pasta Imagens através da função os.mkdir() . r+"/Pictures" é apenas uma simples manipulação de strings para unir a string do subdiretório e a string "/ Pictures" para formar um caminho

Substitua "/ Imagens" por "/ Foto" para atender às suas necessidades

    
por Sergiy Kolodyazhnyy 14.09.2016 / 19:39
5

Se você estiver usando o bash, basta executar:

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

A opção globstar torna ** igual a "todos os arquivos e 0 ou mais diretórios e subdiretórios". Em outras palavras, combina tudo de forma recursiva. Por causa do / no final, **/ corresponderá a todos os diretórios e subdiretórios (sem arquivos). Portanto, o $d irá iterar sobre todos os diretórios no diretório atual e seus subdiretórios e o diretório Photos será criado em cada um deles.

A sinalização -p de mkdir significa:

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

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

Observe que isso não criará um subdiretório Photo em um diretório de destino que contenha um arquivo chamado Foto. Você ainda 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.

    
por terdon 14.09.2016 / 16:10