Como copiar todos os arquivos HTML de uma árvore de diretórios para um único diretório

7

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
    
por simpatico 10.05.2011 / 21:03

5 respostas

3

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

    
por 10.05.2011 / 22:08
12

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
    
por 10.05.2011 / 21:19
4

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/
    
por 11.05.2011 / 00:03
2

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.

    
por 10.05.2011 / 21:19
2

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.

    
por 03.06.2011 / 19:20