alternativa de comando único “padrão” para 'mkdir -p BASE / a / b / c & cp -a -t BASE / a / b / c / a / b / c / d'?

3

A sequência de comandos

mkdir -p BASE/a/b/c && cp -a --target-directory=BASE/a/b/c /a/b/c/d

cria um subdiretório a/b/c em BASE e copia a árvore de diretórios em /a/b/c/d para BASE/a/b/c .

Um problema é que isso envolve muitas repetições, o que convida a erros.

Eu posso rolar uma função de shell que encapsula essa operação; por exemplo, aqui está um esboço sem qualquer verificação / manipulação de erros:

copytwig () {
    local source=$1
    local base=$2
    local target=$base/$( dirname $source )

    mkdir -p $target && cp -a --target-directory=$target $source
}

... mas eu queria saber se isso já poderia ser feito com um utilitário "padrão" do Unix (onde eu estou usando o "padrão" como abreviação para "provavelmente ser encontrado em um sistema Unix, ou pelo menos provável de ser ser encontrado em um sistema Linux ").

    
por kjo 19.03.2018 / 14:56

2 respostas

3

Com pax (um utilitário POSIX obrigatório, embora não seja instalado por padrão em algumas distribuições GNU / Linux):

pax -s':^:BASE/:' -pe -rw /a/b/c/d .

(observe que nem --target-directory nem -a são opções padrão de cp . Essas são extensões GNU).

Observe que com -pe (semelhante ao -a do GNU), pax tentará copiar os metadados (horas, proprietário, permissões ...) dos componentes do diretório também (enquanto BASE 's metadados serão como se fossem criados com mkdir BASE ).

    
por 19.03.2018 / 16:24
2

Você pode usar a opção --parents para cp para preservar a estrutura de diretórios.

mkdir BASE && cp --parents -a --target-directory=BASE /a/b/c/d

Edit: desculpe, você pediu uma solução Unix, mas isso parece ser apenas Linux. : (

    
por 19.03.2018 / 15:06