Cree una carpeta "Foto" dentro de todos los directorios de forma recursiva

Cree una carpeta "Foto" dentro de todos los directorios de forma recursiva

Tengo un montón de carpetas y quiero recorrer todas esas carpetas y en cada carpeta crear otra carpeta llamada "Foto".

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

Quiero tener:

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

Respuesta1

Puedes lograrlo usando una sola findllamada.

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

La parte -name 'Photo' -prune -oindica que no recurra a 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úa con directorios ( -type d) y ejecuta ( -exec) el comando.

Respuesta2

Podrías pasar findlos resultados a whileen lugar de forya que de esta manera no se romperá si los nombres de los archivos tienen espacios.

Primero cd al directorio F1, luego haga:

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 otras rarezas exóticas, use esto que puede manejar nombres arbitrarios:

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

Gracias a @terdon por ayudar con esto :)

Respuesta3

Desde el directorio justo encima de F1, ejecute este script:

El propósito del script es evitar que se creen directorios de fotografías redundantes en directorios de fotografías.

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 fotografías en los palacios equivocados.

Además, mi intención era 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)

Guión actualizado:

  • Cambió las minúsculas pa photomayúsculas.
  • Se agregó soporte para nombres de archivos no estándar (con sugerencias de Terdon).

Respuesta4

Si estás usando bash, simplemente puedes 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 del directorio actual y sus subdirectorios y el Photosdirectorio se creará en cada uno de ellos.

La -pbandera de mkdirlos medios:

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

Aquí, sólo 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 unarchivollamada 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.

información relacionada