
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 find
llamada.
find . -name 'Photo' -prune -o -type d -exec mkdir {}/Photo \;
La parte -name 'Photo' -prune -o
indica que no recurra a 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úa con directorios ( -type d
) y ejecuta ( -exec
) el comando.
Respuesta2
Podrías pasar find
los resultados a while
en lugar de for
ya 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, mkdir
simplemente 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 F1
directorio 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
p
aphoto
mayú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 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 del directorio actual y sus subdirectorios y el Photos
directorio se creará en cada uno de ellos.
La -p
bandera de mkdir
los 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 Photo
subdirectorio 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.