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
command-line
mkdir
OOzy Pal
fuente
fuente
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.La parte
-name 'Photo' -prune -o
le indica que no vuelva a losPhoto
directorios existentes (y recién creados) : si el archivo (o directorio) encontrado tiene el nombrePhoto
, deje de procesarlo (-prune
). En el otro caso (-o
), continúe con los directorios (-type d
) y ejecute (-exec
) el comando.fuente
-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 enwhile
lugar de,for
ya que de esta manera no se romperá si los nombres de archivo tienen espaciosPrimero cd al directorio
F1
, luego haz: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:
Gracias a @terdon por la ayuda con esto :)
fuente
F1
directorio de operaciones es~user/Pictures
, moverse al directorio padre y ejecutar la línea colocará unPhoto
directorio en cada directorio en su espacio, que podría ser miles. Considere agregar elF1
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 @LDJamesPython con
os.walk
puede hacerlo con bastante facilidad y en solo unas pocas líneas de códigoExplicación
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 porr
), creamos la carpeta Imágenes a través de laos.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 rutaReemplace "/ Imágenes" con "/ Foto" para satisfacer sus necesidades
fuente
Si está usando bash, simplemente puede ejecutar:
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 elPhotos
directorio se creará en cada uno de ellos.La
-p
bandera de losmkdir
medios: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.fuente