Mover arquivos e diretórios, exceto um em específico

1. Mover arquivos e diretórios, exceto um em específico

Leonardo Soldi Sovrani dos Santos
devsoldi

(usa Debian)

Enviado em 07/07/2022 - 10:25h

Bom dia a todos!!!
estou com a seguinte dificuldade...
tenho o diretório que estão os arquivos atuais de um site, dentro desse diretório, tenho um subdiretório chamado aprovacao
no script, cria um diretório chamado antigo para mover os arquivos e diretórios atuais para lá, e mover os arquivos do diretório aprovacao, para o diretório principal
o problema, é que ao mover para o diretório criado, antigo, move tudo para lá, até o diretório aprovacao, alguém sabe, de um maneira de como mover tudo, do dir principal exceto o dir aprovacao ?
montei a seguinte estrutura
as variáveis estão vindo do PHP
#!/bin/bash
dominio=$1
diretorio=$2
cd $2
# Criando o diretório para "backup" dos arquivos.
mkdir antigo"$(date +%Y)" 2>/dev/null
# Movendo para o diretório criado.
mv $(ls -p) antigo"$(date +%Y)"/

quem puder me dar uma força, ficarei muito grato, abraço.


  


2. Re: Mover arquivos e diretórios, exceto um em específico

leandro peçanha scardua
leandropscardua

(usa Ubuntu)

Enviado em 07/07/2022 - 13:51h


Não estou no terminal p testar o comando, mas vc pode tentar algo proximo de
find diretorio_raiz ! -name aprovacao -exec mv {} bkp/{}\;
Mas eu faria de outra forma. Moveria o diretorio aprovacao para outro local, copiaria o conteudo do diretorio para antigo, copiaria o conteudo de aprovacao para a raiz e depois faria um gzip em aprovacao como backup.


3. Re: Mover arquivos e diretórios, exceto um em específico

jota
stormer

(usa Outra)

Enviado em 09/07/2022 - 09:12h

Não é necessário usar o `find' para gerar listas de arquivos na maioria das vezes, ainda mais se for para gerar uma lista simples como a que você precisa.

No Bash, define-se a variável $GLOBIGNORE com os globs, ou nomes de arquivos, separados por ``:'' que não se deseja que sejam incluídos nas expansões de glob da shell.

Por exemplo:

cd aprovacao

mkdir -p "antigo$(date +%Y)" || exit

GLOBIGNORE='antigo*'

mv * "antigo$(date +%Y)"


No Zsh, basta usar o operador ``~'' depois do glob quantas vezes precisar:

mv *~antigo*  "antigo$(date +%Y)" 


No caso, vamos ignorar todos os arquivos que tem o nome começando por `antigo', assim usamos o glob `antigo*' para não nos preocupar com o restante do nome do diretório, mas poderíamos usar `antigo*/' para dizer somente diretórios, e `antigo*(/)' no Zsh, enfim...


4. Re: Mover arquivos e diretórios, exceto um em específico

Carlos A. P. Cunha
Carlos_Cunha

(usa Linux Mint)

Enviado em 09/07/2022 - 11:52h


stormer escreveu:

Não é necessário usar o `find' para gerar listas de arquivos na maioria das vezes, ainda mais se for para gerar uma lista simples como a que você precisa.

No Bash, define-se a variável $GLOBIGNORE com os globs, ou nomes de arquivos, separados por ``:'' que não se deseja que sejam incluídos nas expansões de glob da shell.

Por exemplo:

cd aprovacao

mkdir -p antigo"$(date +%Y)" || exit

GLOBIGNORE='antigo*'

mv * "antigo$(date +%Y)"


No Zsh, basta usar o operador ``~'' depois do glob quantas vezes precisar:

mv *~antigo*  "antigo$(date +%Y)" 


No caso, vamos ignorar todos os arquivos que tem o nome começando por `antigo', assim usamos o glob `antigo*' para não nos preocupar com o restante do nome do diretório, mas poderíamos usar `antigo*/' para dizer somente diretórios, e `antigo*(/)' no Zsh, enfim...


Muito Boa Dica de resolução!!!!
Fiquei curioso para ver se funcionaria e de fato sim!!

#-------------------------------------------------------------------------------------#
"Falar é fácil, me mostre o código." - Linus Torvalds
#-------------------------------------------------------------------------------------#



5. Re: Mover arquivos e diretórios, exceto um em específico

jota
stormer

(usa Outra)

Enviado em 09/07/2022 - 13:19h

Supondo que não haja nenhum outro arquivo começando com `a' naquele diretório a não ser pastas nomeadas `antigo...' , poder-se-ia dizer:

mv [^a]* "antigo$(date +%Y)"  


Se houver outros arquivos que comecem com `a', mas nenhum outro que comece com `an', então pode-se usar dois globs para listar 99% dos arquivos:
mv  [^a]*  a[^n]*  "antigo$(date +%Y)"  


Explicando melhor, o operador `[...]' é uma lista de caracteres, e quando se usa o operador `[^...]' ou `[!...]' é uma lista negada de caracteres, ou seja, qualquer caractere exceto os listados.. E em língua glob, o asterisco `*' representa qualquer coisa (diferentemente do que o asterisco significa em linguagem regex). Assim `[^a]*' quer dizer ``expandir para qualquer nome depois do primeiro caractere que não seja `a'''.