Como excluir uma pasta ao usar o comando mv

0

Eu tenho esta situação onde eu quero excluir um diretório enquanto estiver usando o comando mv . Eu vi esse exemplo em que a sintaxe seria !(exclude_dir) , mas quando configuro um cenário para testá-lo, obtenho resultados que não entendo completamente.

Agora, criei três pastas: f1 , f2 e f3 . Agora eu uso o comando desta maneira:

mv -t f3/ !(f1) f2

Isso produz esse erro:

mv: cannot move 'f3' to a subdirectory of itself, 'f3/f3'
mv: cannot stat 'f2': No such file or directory

Agora, engraçado, a estrutura da pasta é agora:

.
├── f1
└── f3
    └── f2

3 directories, 0 files

Ele faz o que eu quero, mas por que as mensagens de erro. Obviamente, não estou usando esse comando corretamente.

    
por George Udosen 15.12.2017 / 20:03

2 respostas

5

Isso não tem nada a ver com mv , mas é um recurso bash , citando man bash :

% bl0ck_qu0te%

!(f1) corresponde a f2 f3 no seu exemplo, então você está fazendo o seguinte:

mv -t f3/ f2 f3 f2

Para alcançar seu objetivo, você deve preferir:

mv -t f3/ !(f[13]) # or !(f1|f3)

Esta expressão corresponde a tudo, exceto f1 e f3 .

Isso também funciona com * , ? e […] :

$ ls
e1  e2  e3  f1  f2  f3
$ ls !(e*|?[12])
f3
    
por dessert 15.12.2017 / 20:09
4

!(f1) é uma glob expressão estendida , portanto (desde que a opção extglob shell esteja definida) ela seja expandida para uma lista de arquivos (não) correspondentes . Em outras palavras, se o diretório continha originalmente f1 , f2 , f3 then

mv -t f3/ !(f1) f2

expande-se como

mv -t f3/ f2 f3 f2

O primeiro erro deve ser óbvio; o segundo é porque ele tenta mover f2 duas vezes - e falha na segunda vez.

    
por steeldriver 15.12.2017 / 20:08