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 F1
diretó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:
p
em photo
para maiúsculas.ls
nã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 $i
s contenha uma nova linha.
Você pode conseguir isso usando uma única find
chamada.
find . -name 'Photo' -prune -o -type d -exec mkdir {}/Photo \;
A parte -name 'Photo' -prune -o
diz para não recorrer aos Photo
diretó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 d
junto com -name 'Photo'
antes -prune
.
find
continuará com outras pastas (incluindo subpastas dessa pasta, se você estiver solicitando isso).
Você pode passar os find
resultados para, e while
não, for
pois 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, mkdir
apenas 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 :)
F1
diretório do op estiver ~user/Pictures
, mover para o diretório pai e executar a linha colocará um Photo
diretório em todos os diretórios em seu espaço, que podem ser milhares. Considere adicionar o F1
como 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.walk
pode 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 -c
flag 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 globstar
opçã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 $d
iterará sobre todos os diretórios no diretório atual e seus subdiretórios e o Photos
diretório será criado em cada um deles.
A -p
bandeira dos mkdir
meios:
-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 Photo
subdiretó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.