¿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 touch
un 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 find
implementaciones, pero no todas, te permiten escribirfind . -type d -exec touch {}/file \;
Si desea copiar algún contenido de referencia, deberá llamar find
en 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 touch
archivos 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á touch
el 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