web-development-kb-pt.site

Lista de exclusão de MV de linha de comando

Existe uma maneira de mv, cp ou qualquer operação de arquivo, tal que eu pudesse especificar todos os arquivos i não Quer afetado?

Por exemplo, digamos que eu tenha uma pasta com os arquivos file1, file2, e file3, e eu quero me mover file1 e file2 em algum lugar. Em vez de nomear explicitamente os arquivos para se mover (mv file1 file2 /path/to/destination), Eu quero nomear os arquivos não para mover e ter todos os outros na pasta ser movido (mv --some-switch file3 /path/to/destination)

11
Glide
  • Você pode usar os padrões globbing avançados em algumas conchas para corresponder a todos os arquivos em um diretório, exceto para aqueles que correspondem a um determinado padrão. Por exemplo, em Ksh, Bash ou ZSH, o comando

    shopt -s extglob   ## needed in bash only
    setopt ksh_glob   ## needed in zsh only
    mv /source/!(*.bak) /destination
    

    moverá todos os arquivos em /source Para /destination Exceto para os arquivos correspondentes *.bak. No ZSH, você também pode escrever /source/^*.bak Se você executar pela primeira vez setopt extended_glob, E mais geralmente (novamente exigindo setopt extended_glob) /source/*~*.bak (Ou /source/a*~*.bak Para todos os arquivos cujo nome começa com a exceto para .bak arquivos, etc).

  • ZSH tem um comando de copia/movimento/link de massa que pode ser usado, entre outros, para mover todos os arquivos, exceto para aqueles que correspondem a um padrão. Por exemplo, o seguinte comando move todos os arquivos, exceto *.bak De /source Para target, e adiciona .bak Ao seu nome no processo:

    autoload zmv
    zmv '/source/(*)~*.bak' '/target/$1.bak'
    
  • Existem vários comandos chamados rename flutuando ao redor. No Debian e no Ubuntu, /usr/bin/rename É um script Perl que move arquivos para um novo nome gerado por uma expressão perl. Você pode excluir arquivos de renomear não gerando um novo nome se o arquivo for excluído. Por exemplo, o seguinte comando (usando este programa específico rename _) move todos os arquivos, exceto *.bak De /source Para /target:

    rename 's!/source!/target! unless m!\.bak$!' /source/*
    
  • Você pode usar o comando find para selecionar os arquivos que deseja mover. Por exemplo, o seguinte comando move todos os arquivos regulares, exceto *.bak Em /source Ou um subdiretório em /target (Observe que a estrutura do diretório é recolhida):

    find /source -type f \! -name '*.bak' -exec mv {} /target/ \;
    

    ou (mais eficiente se houver muitos arquivos para mover)

    find /source -type f \! -name '*.bak' -exec sh -c 'mv "[email protected]" "$0"' /target/ {} +
    
  • rsync é uma generalização de cp e scp com regras de inclusão/exclusão muito poderosas. Por exemplo, o seguinte comando copia todos os arquivos, exceto *.bak Em /source Ou um subdiretório em /target, Respeitando a estrutura de diretório:

    rsync -a --exclude '*.bak' /source/ /target/
    
  • pax é (entre outras coisas) outro cp em esteróides. Suas regras de exclusão não são tão poderosas quanto a RSYNC, mas tem a capacidade adicional de renomear arquivos como eles são copiados. Se você renomear um arquivo para a string vazia, ela é excluída da cópia. Por exemplo, o comando a seguir cópia todos os arquivos, exceto *.bak Em /source Ou um subdiretório em /target E renomear os arquivos para .bak Passando.

    cd /source && pax -rw -pp -s '/.*\.bak$//' -s '/$/.bak/' . /target/
    

    O exemplo acima tem o efeito colateral infeliz da criação de diretórios chamados foo.bak, Que pode ser evitado combinando find com pax:

    { cd /source && find . -type f; } | \
    pax -rw -pp -s '/.*\.bak$//' -s '/$/.bak/' /target/
    
19