Lista de exclusão de mv da linha de comando

11

Existe uma maneira de mv, cpou qualquer operação de arquivo, de modo que eu possa especificar todos os arquivos que não quero que sejam afetados?

Por exemplo, digamos que eu tenho uma pasta com os arquivos file1, file2e file3, e eu quero mover file1e file2em algum lugar. Em vez de nomear explicitamente os arquivos para mover ( mv file1 file2 /path/to/destination), desejo nomear os arquivos para não serem movidos e fazer com que todos os outros na pasta sejam movidos ( mv --some-switch file3 /path/to/destination)

Deslizar
fonte
Eu acredito que mv file1 file2 /path/to/destinationnão vai fazer o que você quer que ele faça
phunehehe

Respostas:

19
  • Você pode usar os padrões de globbing avançados em algumas shells para corresponder a todos os arquivos em um diretório, exceto aqueles que correspondem a um padrão específico. 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 /sourcepara, /destinationexceto os arquivos correspondentes *.bak. No zsh, você também pode escrever /source/^*.bakse executar pela primeira vez setopt extended_globe de maneira mais geral (novamente exigindo setopt extended_glob) /source/*~*.bak(ou /source/a*~*.bakpara todos os arquivos cujo nome começa com aexceção de .bakarquivos, etc.).

  • O Zsh possui um comando de copiar / mover / link em massa que pode ser usado, entre outros, para mover todos os arquivos, exceto aqueles que correspondem a um padrão. Por exemplo, o comando a seguir move todos os arquivos, exceto *.bakde /sourcepara target, e adiciona .bakseu nome no processo:

    autoload zmv
    zmv '/source/(*)~*.bak' '/target/$1.bak'
    
  • Existem vários comandos chamados renameflutuando. No Debian e no Ubuntu, /usr/bin/renameé um script perl que move os arquivos para um novo nome gerado por uma expressão perl. Você pode excluir os arquivos da renomeação não gerando um novo nome se o arquivo tiver que ser excluído. Por exemplo, o comando a seguir (usando este renameprograma específico ) move todos os arquivos, exceto *.bakde /sourcepara /target:

    rename 's!/source!/target! unless m!\.bak$!' /source/*
    
  • Você pode usar o findcomando para selecionar os arquivos que deseja mover. Por exemplo, o seguinte comando move todos os arquivos regulares, exceto *.bakem /sourceou em um subdiretório em /target(note que a estrutura de diretórios é recolhido):

    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 "$@" "$0"' /target/ {} +
    
  • rsyncé uma generalização cpe scpcom regras de inclusão / exclusão muito poderosas. Por exemplo, o comando a seguir copia todos os arquivos, exceto *.bakem /sourceou em um subdiretório /target, respeitando a estrutura de diretórios:

    rsync -a --exclude '*.bak' /source/ /target/
    
  • paxé (entre outras coisas) outro cpem esteróides. Suas regras de exclusão não são tão poderosas quanto as do rsync, mas tem a capacidade adicional de renomear arquivos à medida que são copiados. Se você renomear um arquivo para a sequência vazia, ele será excluído da cópia. Por exemplo, o comando a seguir copia todos os arquivos, exceto *.bakem /sourceou em um subdiretório /target, e renomeia os arquivos para .bakde passagem.

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

    O exemplo acima tem o efeito colateral infeliz de criar diretórios chamados foo.bak, que podem ser evitados combinando-se findcom pax:

    { cd /source && find . -type f; } | \
    pax -rw -pp -s '/.*\.bak$//' -s '/$/.bak/' /target/
    
Gilles 'SO- parar de ser mau'
fonte
Impressionante. Uma possível correção: Eu acho que as findnecessidades de comando para terminar em\;
Steven D
@ Steven: Obrigado, continuo esquecendo que você só pode usar +imediatamente a seguir {}.
Gilles 'SO- stop be evil'
boa lista, thx por isso. :-)
echox 14/09
1
que resposta, polegares para cima :) :) #
314 Dzung Nguyen