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.