Comment copyr tous les files HTML d'une arborescence de directorys vers un seul directory

Je veux copyr tous les files .html de myDir et de ses sous-directorys vers ~/otherDir . Voici ce que j'ai essayé, mais ça ne marche pas:

 $ find myDir -name *.html -print | xargs -0 cp ~/otherDir usage: cp [-R [-H | -L | -P]] [-fi | -n] [-apvX] source_file target_file cp [-R [-H | -L | -P]] [-fi | -n] [-apvX] source_file ... target_directory 

find myDir -name '*.html' -print0 | xargs -0 -J % cp % ~/otherdir

Tout d'abord, le shell est en train de globuler le '*' pour vous. Soit l'échapper avec \ ou utiliser des guillemets autour de *.html

Ainsi:

find myDir -name "*.html" ou find myDir -name \*.html

Ignorez l'utilisation de xargs avec le commutateur -exec :

find myDir -name "*.html" -exec cp {} ~/otherDir \;

Cela fonctionne parce que {} prend la place du file trouvé, et est exécuté une fois pour chaque match.

Notez également que cela aplatira la copy du directory source. Exemple:

 myDir/a.html myDir/b/c.html 

va céder

 otherdir/a.html otherdir/c.html 

Donc, vous voulez copyr tous les files .html dans un directory source et ses sous-directorys, tous dans un seul directory (c'est-à-dire réduire la hiérarchie)?

Norme POSIX :

 find myDir -name '*.html' -type f -exec sh -c 'cp "$@" "$0"' ~/otherDir {} + 

Notez que ~/otherDir devient le paramètre 0 du shell intermédiaire, ce qui permet aux files source d'être précisément "$@" . Le fait de quitter le directory cible en dehors du shell présente l'avantage supplémentaire de ne pas rencontrer de problèmes de citation s'il s'agit d'une variable du script shell parent ( -exec sh -c 'cp "$@" "$0"' "$target" ) .

Pour les systèmes plus anciens qui n'ont pas find … -exec … + :

 find myDir -name '*.html' -type f -exec cp {} ~/otherDir \; 

Je votre shell est bash ≥4 ou zsh:

 shopt -s globstar # only for bash, put it in your `.bashrc` cp myDir/**/*.html ~/otherDir/ 

essayer

 find myDir -name '*.html' -exec cp -t ~/otherdir {} + 

Un problème avec cette approche est qu'elle ne crée pas de sous-directorys, donc tous les files sont placés dans ~/otherDir et les files qui sont nommés de la même manière, mais dans différentes parties de l'arborescence myDir , ne sont pas copiés.

Si cela vous pose un problème, vous pouvez utiliser ce qui suit pour créer la même arborescence de directorys dans l'arborescence ~/otherDir

 find myDir -name '*.html' | cpio -pdm ~/otherdir 

Je n'ai pas de mac

 find myDir -name '*.html' -print | xargs -I {} cp {} ~/otherDir 

ou si vous pouvez

 find myDir -name '*.html' -print0 | xargs -0 -I {} cp {} ~/otherDir 

car cela sera sans danger pour les files avec des espaces dans le nom.

Est-ce que OSX supporte -execdir pour find?

  find ./myDir -name "*.html" -execdir cp {} /abspath/to/otherDir ";" 

Gnu / find suggère d'utiliser -execdir au lieu de -exec pour la plupart des cas.