Agregue recursivamente un archivo a todos los subdirectorios

Agregue recursivamente un archivo a todos los subdirectorios

¿Cómo agrego (o toco) de forma recursiva un archivo en el directorio actual, así como en todos los subdirectorios?

Por ejemplo,
me gustaría convertir este árbol de directorios:

.
├── 1
│   ├── A
│   └── B
├── 2
│   └── A
└── 3
    ├── A
    └── B
        └── I   
9 directories, 0 files

en

.
├── 1
│   ├── A
│   │   └── file
│   ├── B
│   │   └── file
│   └── file
├── 2
│   ├── A
│   │   └── file
│   └── file
├── 3
│   ├── A
│   │   └── file
│   ├── B
│   │   ├── file
│   │   └── I
│   │       └── file
│   └── file
└── file

9 directories, 10 files

Respuesta1

Qué tal si:

find . -type d -exec cp file {} \;

De man find:

   -type c
          File is of type c:
           d      directory

   -exec command ;
          Execute  command;  All following arguments to find are taken 
          to be arguments to the command until an  argument  consisting 
          of `;' is encountered.  The string `{}' is replaced by the 
          current file

Entonces, el comando anterior encontrará todos los directorios y se ejecutará cp file DIR_NAME/en cada uno de ellos.

Respuesta2

Si solo desea crear un archivo vacío, puede usar touchun shell global. En zsh:

touch **/*(/e:REPLY+=/file:)

En fiesta:

shopt -s globstar
for d in **/*/; do touch -- "$d/file"; done

De forma portátil, puedes utilizar find:

find . -type d -exec sh -c 'for d; do touch "$d/file"; done' _ {} +

Algunas findimplementaciones, pero no todas, te permiten escribirfind . -type d -exec touch {}/file \;

Si desea copiar algún contenido de referencia, deberá llamar finden un bucle. En zsh:

for d in **/*(/); do cp -p reference_file "$d/file"; done

En fiesta:

shopt -s globstar
for d in **/*/; do cp -p reference_file "$d/file"; done

Portátilmente:

find . -type d -exec sh -c 'for d; do cp -p reference_file "$d/file"; done' _ {} +

Respuesta3

Cuando desee toucharchivos llamados $name en el directorio actual y en todos los subdirectorios, esto funcionará:

find . -type d -exec touch {}/"${name}"  \;

Tenga en cuenta que el comentario de ChuckCottrill a la respuesta de terdon NO funciona, ya que solo aparecerá touchel archivo llamado $name en el directorio actual y el directorio mismo.

No creará archivos en subdirectorios según lo solicitado por el OP, mientras que esta versión aquí sí lo hará.

Respuesta4

Otro ejemplo que estaba probando dado el suyo es crear archivos consecutivos en un subdirectorio específico como lo tengo aquí.

├── FOLDER
│   ├── FOLDER1
│   └── FOLDER2
├── FOLDER
│   ├── FOLDER1
│   └── FOLDER2
└── FOLDER
    ├── FOLDER1
    └── FOLDER2

Utilicé este comando a continuación para crear solo en los archivos del directorio FOLDER2 con una secuencia numérica consecutiva comofile{1..10}

for d in **/FOLDER2/; do touch $d/file{1..10}.doc; done

información relacionada