Este coringa existe em ksh93, bash ≥4.3 (≥ 4.0 se não houver link simbólico para diretórios em sua árvore) e zsh. É escrito **
. No ksh93, ele precisa ser ativado primeiro com set -o globstar
. No bash, ele precisa ser ativado primeiro com shopt -o globstar
.
ls -l src/**/foobar/**/*.java
Isso não serve para fazer a cópia. O destino de cp
é um único diretório, cp
não faz correspondência de caractere curinga. Você não pode usar um único comando cp
para descartar arquivos em locais diferentes.
Você pode usar o rsync . Passe a raiz da árvore de origem e a raiz da árvore de destino e defina as regras de inclusão e exclusão para copiar somente os arquivos desejados e os diretórios que levam a eles. O Rsync irá copiar diretórios vazios também se eles corresponderem ao padrão, você pode fazê-lo excluí-los depois com --prune-empty-dirs
.
rsync --include='**/foobar/**/*.java' --include='**/' \
--exclude='*' --prune-empty-dirs \
src/ trusted/src/main/java/
Outra ferramenta que você pode usar é pax . Note que pax é o padrão em que é definido pelo POSIX (ao contrário do rsync), mas algumas distribuições do Linux o omitem da instalação padrão (no entanto, ele está sempre disponível como um pacote). A abordagem é semelhante ao rsync: inclua .java
arquivos, exclua o restante; a sintaxe é um pouco estranha: você especifica uma substituição de padrão, que pode ser o original para incluir um arquivo e não renomeá-lo, ou um substituto vazio para excluir um arquivo. Os diretórios principais são criados automaticamente no destino, conforme necessário.
pax -rw -s '/\.java$/&/' -s '/.*//' src/* trusted/src/main/java/