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 F1
directorio 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:
p
en photo
mayúsculas.ls
no 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 $i
s contiene una nueva línea.
Puede lograrlo con una sola find
llamada.
find . -name 'Photo' -prune -o -type d -exec mkdir {}/Photo \;
La parte -name 'Photo' -prune -o
le indica que no vuelva a los Photo
directorios 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 d
junto con -name 'Photo'
antes -prune
.
find
continuará con otras carpetas (incluidas las subcarpetas de esa carpeta, si así lo solicita).
Puede pasar find
resultados en while
lugar de, for
ya 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, mkdir
simplemente 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 :)
F1
directorio de operaciones es ~user/Pictures
, moverse al directorio padre y ejecutar la línea colocará un Photo
directorio en cada directorio en su espacio, que podría ser miles. Considere agregar el F1
como 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.
F1
lugar, editado @LDJames
Python con os.walk
puede 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 -c
bandera 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 globstar
opció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, $d
iterará sobre todos los directorios en el directorio actual y sus subdirectorios y el Photos
directorio se creará en cada uno de ellos.
La -p
bandera de los mkdir
medios:
-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 Photo
subdirectorio 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.