Respuestas:
Desde el directorio justo arriba de F1 ejecuta este script:
El propósito del script es evitar tener directorios de fotos redundantes creados bajo directorios de fotos.
Además, está diseñado para evitar ejecutarlo accidentalmente desde una ubicación incorrecta, como el directorio raíz del usuario, mientras que no vería el F1directorio y crearía por error cientos de directorios de fotos en los palacios incorrectos.
Además, tenía la intención de crear un script fácil de seguir para que el usuario pudiera personalizarlo.
#!/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 actualizado:
pen photomayúsculas.lsno se analiza. Son solo comentarios para el usuario ... que muestran lo que está sucediendo. Al igual que las palabras "Este es un directorio de fotos". Le permite al usuario saber por qué no está creando un directorio allí.
find -type d F1, ¿tal vez?
$i/Photo, pero el OP no ha especificado qué debe hacerse en tal caso. También fallará en el caso, ciertamente improbable, donde uno de los $is contiene una nueva línea.
Puede lograrlo con una sola findllamada.
find . -name 'Photo' -prune -o -type d -exec mkdir {}/Photo \;
La parte -name 'Photo' -prune -ole indica que no vuelva a los Photodirectorios existentes (y recién creados) : si el archivo (o directorio) encontrado tiene el nombre Photo, deje de procesarlo ( -prune). En el otro caso ( -o), continúe con los directorios ( -type d) y ejecute ( -exec) el comando.
-prune? :) Sí, es bastante contra-intuitivo pero vale la pena aprenderlo.
-type djunto con -name 'Photo'antes -prune.
findcontinuará con otras carpetas (incluidas las subcarpetas de esa carpeta, si así lo solicita).
Puede pasar findresultados en whilelugar de, forya que de esta manera no se romperá si los nombres de archivo tienen espacios
Primero cd al directorio F1, luego haz:
find -type d | while read dir ; do mkdir "$dir"/Photo ; done
Si el directorio existe, mkdirsimplemente se negará a crearlo, así que no hay problema ...
Si los nombres de su directorio pueden contener nuevas líneas u otra extrañeza exótica, use esto que puede tratar con nombres arbitrarios:
find -type d -print0 | while IFS= read -r -d '' dir ; do mkdir "$dir"/Photo ; done
Gracias a @terdon por la ayuda con esto :)
F1directorio de operaciones es ~user/Pictures, moverse al directorio padre y ejecutar la línea colocará un Photodirectorio en cada directorio en su espacio, que podría ser miles. Considere agregar el F1como parte de la línea de comando para evitar un error fácil de cometer. De esa manera, si se ejecuta inadvertidamente desde el lugar equivocado, no creará directorios.
F1lugar, editado @LDJames
Python con os.walkpuede hacerlo con bastante facilidad y en solo unas pocas líneas 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 tratando con este comando: python -c 'import os; [os.mkdir (r + "/ Pictures") para r, d, f en os.walk (".")]'
Aquí simplemente llamamos al intérprete de Python con -cbandera para especificar el comando que damos entre comillas simples. os.walk()La función nos permite recorrer recursivamente todos los subdirectorios, y para cada subdirectorio (representado por r), creamos la carpeta Imágenes a través de la os.mkdir()función. r+"/Pictures"es solo una simple manipulación de cadenas para unir una cadena de subdirectorio y una cadena "/ Pictures" para formar una ruta
Reemplace "/ Imágenes" con "/ Foto" para satisfacer sus necesidades
Si está usando bash, simplemente puede ejecutar:
shopt -s globstar
for d in **/; do mkdir -p "$d"/Photo; done
La globstaropción hace **coincidir "todos los archivos y 0 o más directorios y subdirectorios". En otras palabras, coincide con todo de forma recursiva. Debido /al final, **/coincidirá con todos los directorios y subdirectorios (sin archivos). Por lo tanto, $diterará sobre todos los directorios en el directorio actual y sus subdirectorios y el Photosdirectorio se creará en cada uno de ellos.
La -pbandera de los mkdirmedios:
-p, --parents
no error if existing, make parent directories as needed
Aquí, solo lo estoy usando para suprimir mensajes de error si el directorio de destino ya existe. Elimínelo si desea ver los errores.
Tenga en cuenta que esto no podrá crear un Photosubdirectorio en un directorio de destino que contenga un archivo llamado Foto. Sin embargo, no ha especificado qué se debe hacer en esos casos y todas las demás respuestas publicadas hasta ahora también tienen esta limitación.