Ajouter récursivement un fichier à tous les sous-répertoires

13

Comment ajouter (ou toucher) récursivement un fichier dans le répertoire courant, ainsi que dans tous les sous-répertoires?

Par exemple,
je voudrais transformer cette arborescence de répertoires:

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

dans

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

9 directories, 10 files
Trevor Hickey
la source

Réponses:

14

Que diriez-vous:

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

Ainsi, la commande ci-dessus trouvera tous les répertoires et s'exécutera cp file DIR_NAME/sur chacun d'eux.

terdon
la source
ou, trouvez. -type d -exec touch file {} \;
ChuckCottrill
1
ou,find . -type d -exec touch {}/file\;
Ned64
5

Si vous souhaitez simplement créer un fichier vide, vous pouvez utiliser touchet un glob shell. En zsh:

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

En bash:

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

De manière portable, vous pouvez utiliser find:

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

Certaines findimplémentations, mais pas toutes, vous permettent d'écrirefind . -type d -exec touch {}/file \;

Si vous souhaitez copier du contenu de référence, vous devrez appeler finden boucle. 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

Portablement:

find . -type d -exec sh -c 'for d; do cp -p reference_file "$d/file"; done' _ {} +
Gilles 'SO- arrête d'être méchant'
la source
2

Lorsque vous voulez des touchfichiers appelés $ name dans le répertoire courant et dans tous les sous-répertoires, cela fonctionnera:

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

Notez que le commentaire de ChuckCottrill à la réponse de terdon ne fonctionne PAS, car il ne contiendra que touchle fichier appelé $ name dans le répertoire courant et le répertoire lui-même.

Il ne créera pas de fichiers dans les sous-répertoires comme demandé par l'OP, contrairement à cette version ici.

C König
la source
0

Pour créer simplement un fichier, vous pouvez utiliser touchavec find:

$ find . -type d -exec touch {}/file \;
miked
la source