a barra (/) após um nome de diretório nos comandos do shell

14

Eu tenho uma pequena pergunta aqui.

Se eu tiver dois arquivos, digamos fileae fileb, mv filea filebseria

  • excluir fileb
  • renomeie fileaparafileb

Então, se eu tiver dois diretórios, digamos dirae dirb, mv dira dirbseria

  • mudar dirapara dirb(se tornará dirb/dira)

Observando que em ambos os casos não há aviso ou mensagem, isso é bastante inconsistente para mim. Eu acho que mv dira dirbdeveria substituir dirbo conteúdo de dira(ou mesclar os dois diretórios em um diretório chamado dirb).

Lembro-me de ler em algum lugar que um nome de diretório com uma barra (como dira/) é tratado como um diretório, e um nome sem barra (como dira) é tratado como um arquivo (até certo ponto, é claro). De qualquer forma, agora eu quero fazer com que o shell (zsh e possivelmente bash) respeite minha notação de diretório usando uma barra. Existe uma opção de terminal que me permita impor isso?

Para esclarecer, aqui está o meu comportamento desejado:

  • mv dira dirbresulta em dirbser substituído pelo conteúdo dedira
  • mv dira dirb/resulta em diraser movido para dirb(in dirb/dira)

Alguém já pensou da mesma maneira que eu? Ou sou apenas estranho?

phunehehe
fonte
2
Eu acho que o seu comportamento desejado seria bastante perigoso.
starblue
@starblue: sim eu concordo que é perigoso, mas eu prefiro viver com algo perigoso, que a inconsistência
phunehehe

Respostas:

11

Sim, isso é um pouco inconsistente, mesmo dentro das ferramentas GNU.

Um problema com sua proposta é que diretórios não vazios não podem ser removidos. Além disso, -T(na terra GNU, enfim) se aproxima do que você deseja (o primeiro caso):

$ ls dira/ dirb/
dira/:
a

dirb/:
b
$ mv -iT dira/ dirb/
mv: overwrite `dirb/'? y
mv: cannot move `dira/' to `dirb/': Directory not empty
$ rm dirb/b 
$ mv -iT dira/ dirb/
mv: overwrite `dirb/'? y
$ ls dira/ dirb/
ls: cannot access dira/: No such file or directory
dirb/:
a
tshepang
fonte
Você também pode adicionar um alias, por exemplo alias ren=mv -T.
Mikel
0

Se você quiser mover tudo de dira para dirb, poderá executar mv dira/* dirb.

Conforme a página de manual do mv no meu HP-UX.

The mv command moves:

+ One or more directory subtrees (directory1, [directory2, ...]) to a new or existing directory (dest-directory).

Hemant
fonte
3
Seu comando perderia todos os arquivos de pontos.
QBI
Quem precisa de arquivos de ponto de qualquer maneira;)
Robert Massaioli
1
E se for um problema, shopt -s dotglobno bash irá corrigir isso.
David Z