Existe uma maneira de mv
, cp
ou 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
, file2
e file3
, e eu quero mover file1
e file2
em 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
)
command-line
rename
scp
Deslizar
fonte
fonte
mv file1 file2 /path/to/destination
não vai fazer o que você quer que ele façaRespostas:
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
moverá todos os arquivos
/source
para,/destination
exceto os arquivos correspondentes*.bak
. No zsh, você também pode escrever/source/^*.bak
se executar pela primeira vezsetopt extended_glob
e de maneira mais geral (novamente exigindosetopt extended_glob
)/source/*~*.bak
(ou/source/a*~*.bak
para todos os arquivos cujo nome começa coma
exceção de.bak
arquivos, 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
*.bak
de/source
paratarget
, e adiciona.bak
seu nome no processo:Existem vários comandos chamados
rename
flutuando. 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 esterename
programa específico ) move todos os arquivos, exceto*.bak
de/source
para/target
:Você pode usar o
find
comando para selecionar os arquivos que deseja mover. Por exemplo, o seguinte comando move todos os arquivos regulares, exceto*.bak
em/source
ou em um subdiretório em/target
(note que a estrutura de diretórios é recolhido):ou (mais eficiente se houver muitos arquivos para mover)
rsync
é uma generalizaçãocp
escp
com regras de inclusão / exclusão muito poderosas. Por exemplo, o comando a seguir copia todos os arquivos, exceto*.bak
em/source
ou em um subdiretório/target
, respeitando a estrutura de diretórios:pax
é (entre outras coisas) outrocp
em 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*.bak
em/source
ou em um subdiretório/target
, e renomeia os arquivos para.bak
de passagem.O exemplo acima tem o efeito colateral infeliz de criar diretórios chamados
foo.bak
, que podem ser evitados combinando-sefind
compax
:fonte
find
necessidades de comando para terminar em\;
+
imediatamente a seguir{}
.