Respostas:
No diretório logo acima de 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 foi projetado para evitar executá-lo acidentalmente em um local errado, como o diretório raiz do usuário, enquanto ele não veria o F1diretório e criaria, por engano, centenas de diretórios de fotos nos palácios errados.
Além disso, minhas intenções eram 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:
pem photopara maiúsculas.lsnão é analisado. É apenas um feedback para o usuário ... mostrando o que está acontecendo. Assim como as palavras "Este é um diretório de fotos". Está deixando o usuário saber por que não está criando um diretório lá.
find -type d F1, talvez?
$i/Photo, mas o OP não especificou o que deve ser feito nesse caso. Também falhará no caso, reconhecidamente improvável, em que um dos $is contenha uma nova linha.
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 aos 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.
-prune? :) Sim, é bastante contra-intuitivo, mas vale a pena aprender.
-type djunto com -name 'Photo'antes -prune.
findcontinuará com outras pastas (incluindo subpastas dessa pasta, se você estiver solicitando isso).
Você pode passar os findresultados para, e whilenão, forpois dessa forma não será interrompido se os nomes de arquivos tiverem espaços
Primeiro cd para o diretório F1, então faça:
find -type d | while read dir ; do mkdir "$dir"/Photo ; done
Se o diretório existir, mkdirapenas se recusará a criá-lo, então não há problema ...
Se os nomes dos 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 a @terdon pela ajuda com isso :)
F1diretório do op estiver ~user/Pictures, mover para o diretório pai e executar a linha colocará um Photodiretório em todos os diretórios em seu espaço, que podem ser milhares. Considere adicionar o F1como parte da linha comercial para evitar um erro facilmente cometido. Dessa forma, se for inadvertidamente executado no lugar errado, não criará diretórios.
F1@LDJames vez, editado
Python com os.walkpode fazê-lo facilmente 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
Estamos lidando com este comando: python -c 'import os; [os.mkdir (r + "/ Pictures") para r, d, f em os.walk (".")]'
Aqui, chamamos simplesmente python intérprete com -cflag para especificar o comando que fornecemos entre aspas simples. os.walk()A função nos permite percorrer recursivamente todos os subdiretórios e, para cada subdiretório (representado por r), criamos a pasta Imagens via os.mkdir()função. r+"/Pictures"é apenas uma manipulação simples de string para unir a string do subdiretório e a string "/ Pictures" para formar um caminho
Substitua "/ Pictures" por "/ Photo" para atender às suas necessidades
Se você estiver usando o bash, basta executar:
shopt -s globstar
for d in **/; do mkdir -p "$d"/Photo; done
A globstaropção faz a **correspondência "todos os arquivos e 0 ou mais diretórios e subdiretórios". Em outras palavras, ele corresponde a tudo recursivamente. Por causa do /no final, **/corresponderá a todos os diretórios e subdiretórios (sem arquivos). Portanto, o $diterará 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 apenas usando-o para suprimir mensagens de erro se o diretório de destino já existir. Remova-o se desejar ver os erros.
Observe que isso falhará ao criar um Photosubdiretório em um diretório de destino que contenha um arquivo chamado 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.