copiando arquivos específicos no diretório

3

Estou tentando copiar alguns dos arquivos em um diretório. O diretório contém os seguintes arquivos

meu diretório atual é ~ / certificate /

drwxrwxr-x 2 ubuntu ubuntu     4096 Oct 16 11:58 apache
-rw-rw-r-- 1 ubuntu ubuntu     5812 Oct 16 11:20 apache.keystore
-rw-rw-r-- 1 ubuntu ubuntu     1079 Oct 16 08:31 csr.txt
-rwxr-xr-x 1 ubuntu ubuntu 36626564 Oct 16 10:08 my.war
drwxrwxr-x 2 ubuntu ubuntu     4096 Oct 16 09:39 tomcat
-rw-rw-r-- 1 ubuntu ubuntu     6164 Oct 16 09:31 tomcat.keystore

Eu quero copiar todos os arquivos para ~ / certs / exceto my.war. Eu tentei seguir o comando sem sucesso. Eu não quero mover meu.war fora da pasta, mesmo que temporariamente.

cp -r ~/certificate/(?!m)* ~/cert/. 

Por favor me ajude com uma expressão regular adequada ou qualquer outra ferramenta.

    
por geekgugi 17.10.2013 / 07:05

3 respostas

2

Os padrões de caractere curinga de nome de arquivo portátil são um pouco limitados. Não há como expressar "todos os arquivos, exceto este".

Com os arquivos mostrados aqui, você pode combinar na primeira letra ~/certificate/[!m]* (“todos os nomes de arquivos que começam com um caractere que não seja m ”) ou na última letra ~/certificate/*[^r] .

Se você precisar ajustar a lista de arquivos para copiar portavelmente, use find . Use -type d -prune para evitar recursão em subdiretórios.

cd ~/certificates &&
find . -name . -o -type d -prune -o ! -name 'my.war' -name 'other.exception' -exec sh -c 'cp "$@" "$0"' ~/cert {} +

Se você estiver usando o ksh, poderá usar seus padrões de globos estendidos.

cp ~/certificates/!(my.war|other.exception) ~/cert

Você pode usar o mesmo comando no bash se você executar shopt -s extglob primeiro. Você pode executar o mesmo comando em zsh se executar setopt ksh_glob primeiro. Em zsh, existe uma sintaxe alternativa: execute setopt extended_glob , então um dos

cp ~/certificates/^(my.war|other.exception) ~/cert
cp ~/certificates/*~(my.war|other.exception) ~/cert

Como alternativa, use uma ferramenta de cópia com uma lista de exclusão, como pax ou rsync. Pax é recursivo por padrão; você pode usar a opção -d para copiar diretórios, mas não o conteúdo deles.

rsync --exclude='my.war' --exclude='other.exception' ~/certificates/ ~/cert/

pax -rw -s '!/my\.war$!!' -s '!/other\.exception$!!' ~/certificates/ ~/cert/
    
por 18.10.2013 / 01:15
2

Você pode usar este comando:

$ cp -R ~/certificate/[act]* ~/certs/.

Eu costumo fazer algo assim para testar meus globos de shell.

$ echo certificate/[act]*
certificate/apache certificate/apache3.keystore certificate/csr.txt certificate/tomcat certificate/tomcat.keystore

Os globos do shell não são expressões regulares, acredito que sejam chamados de padrões.

Correspondência de padrões

O recurso no Bash que faz a correspondência de padrões é muito bem documentado na página man do Bash na seção intitulada: " Correspondência de padrões ".

    
por 17.10.2013 / 07:18
1
find ~/certificates -type d -name '*' -exec mkdir -p ~/certs/{} \;

mova os diretórios

find ~/certificates ! -filetype f ! -name "my.war" -exec cp "{}" ~/cert \;

mova os arquivos, mas não ( ! ) os nomeados ( -name ) my.war ( "my.war" ) com as aspas em torno de my.war impedindo que o . seja interpretado pelo shell.

    
por 17.10.2013 / 07:48