find myDir -name '*.html' -print0 | xargs -0 -J % cp % ~/otherdir
Eu quero copiar todos os arquivos .html
de myDir
e seus subdiretórios para ~/otherDir
. Aqui está o que eu tentei, mas não funciona:
$ 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
Primeiro de tudo, o shell está globbing o '*' para você. Ou escape com \
ou use aspas em torno de *.html
Assim:
find myDir -name "*.html"
ou find myDir -name \*.html
Ignore o uso da opção xargs
com find
-exec
:
find myDir -name "*.html" -exec cp {} ~/otherDir \;
Isso funciona porque {}
ocupa o lugar do arquivo que find
encontrou e é executado uma vez para cada correspondência.
Observe também que isso achatará a cópia do diretório de origem. Exemplo:
myDir/a.html
myDir/b/c.html
produzirá
otherdir/a.html
otherdir/c.html
Então, você deseja copiar todos os arquivos .html
em algum diretório de origem e seus subdiretórios, tudo para um único diretório (ou seja, recolhendo a hierarquia)?
POSIX Standard:
find myDir -name '*.html' -type f -exec sh -c 'cp "$@" "$0"' ~/otherDir {} +
Observe que ~/otherDir
se torna o parâmetro 0 para o shell intermediário, o que permite que os arquivos de origem sejam precisamente "$@"
. Deixar o diretório de destino fora do shell tem a vantagem adicional de que você não encontrará problemas de cotação se for uma variável no script de shell pai ( -exec sh -c 'cp "$@" "$0"' "$target"
).
Para sistemas mais antigos que não têm find … -exec … +
:
find myDir -name '*.html' -type f -exec cp {} ~/otherDir \;
Eu seu shell é bash ≥4 ou zsh:
shopt -s globstar # only for bash, put it in your '.bashrc'
cp myDir/**/*.html ~/otherDir/
Tente
find myDir -name '*.html' -exec cp -t ~/otherdir {} +
Um problema com essa abordagem é que ela não cria subdiretórios, então todos os arquivos são colocados em ~/otherDir
e arquivos que são nomeados da mesma forma, mas em partes diferentes da árvore myDir
, não são copiados. / p>
Se isso causar um problema, você poderá usar o seguinte para criar a mesma árvore de diretórios na árvore ~/otherDir
find myDir -name '*.html' | cpio -pdm ~/otherdir
Eu não tenho um mac
find myDir -name '*.html' -print | xargs -I {} cp {} ~/otherDir
ou se você puder
find myDir -name '*.html' -print0 | xargs -0 -I {} cp {} ~/otherDir
como isso será seguro para arquivos com espaços no nome.
O suporte do OSX -execir para encontrar?
find ./myDir -name "*.html" -execdir cp {} /abspath/to/otherDir ";"
O Gnu / find sugere o uso de -execdir em vez de -exec para a maioria dos casos.