Agregue recursivamente un archivo a todos los subdirectorios


13

¿Cómo agrego (o toco) recursivamente un archivo al directorio actual, así como a todos los subdirectorios?

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

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

dentro

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

9 directories, 10 files

Respuestas:


14

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.


o encontrar. -tipo d -exec archivo táctil {} \;
ChuckCottrill

1
o,find . -type d -exec touch {}/file\;
Ned64

5

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

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

En bash:

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

Portablemente, puede usar 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 bash:

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

Portablemente:

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

2

Al querer 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 lo hará touchel archivo llamado $ name en el directorio actual y el directorio en sí.

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


0

Para crear un archivo, puede usarlo touchcon find:

$ find . -type d -exec touch {}/file \;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.