filtrar só as pastas onde tem arquivo [RESOLVIDO]
Responder tópico2. Re: filtrar só as pastas onde tem arquivo
Melhor respostaEnviado em 29/04/2024 - 19:08h
Aqui esta @Minions, eu escreve o script mas os comentários do script eu coloquei o chatGPT para fazer.
Como você pode ver ela comento muito mau e escreveu frases muito grande, mas vai ficar assim.
Testado e funcionando, se fizer com cat fica mais curto, só que o shell Bash é capas de ler arquivos sem precisar chamar o cat, então eu fiz a tarefa que seria do cat usando built-in do Bash.
#!/bin/bash
# Define o comportamento de erro "unbound variable" para terminar o script imediatamente se uma variável não definida for utilizada.
set -u
# Inicia um loop while que vai ler cada linha do arquivo "lista-depastas.txt"
while read lista
do
# Usa o comando sed para remover a última parte do caminho em cada linha do arquivo
# e adiciona o resultado ao array "pastas"
pastas+=($(sed "s,[^/]*$,," <<<"${lista}"))
done <./lista-depastas.txt
# Loop for para percorrer cada elemento do array "pastas"
for cada_linha in "${pastas[@]}"
do
# Cria cada pasta no array "pastas" usando mkdir -p, o "-p" garante que os diretórios pais sejam criados, se necessário.
mkdir -p "${cada_linha}"
done
Como você pode ver ela comento muito mau e escreveu frases muito grande, mas vai ficar assim.
Testado e funcionando, se fizer com cat fica mais curto, só que o shell Bash é capas de ler arquivos sem precisar chamar o cat, então eu fiz a tarefa que seria do cat usando built-in do Bash.
3. Re: filtrar só as pastas onde tem arquivo [RESOLVIDO]
Enviado em 28/04/2024 - 01:16h
Para listar apenas os diretórios que contêm arquivos, você pode usar o seguinte comando:
```bash
find /caminho/do/diretorio -mindepth 1 -type d -exec sh -c 'find "$0" -type f -print -quit' {} \;
```
Em seguida, para pegar apenas o caminho completo dos diretórios listados para usar com o comando mkdir -p, você pode fazer o seguinte:
```bash
find /caminho/do/diretorio -mindepth 1 -type d -exec sh -c 'find "$0" -type f -print -quit' {} \; | xargs dirname
```
Esse comando irá listar apenas os diretórios que contêm arquivos e em seguida pegar o caminho completo desses diretórios para uso com o comando mkdir -p. Espero que isso te ajude!
```bash
find /caminho/do/diretorio -mindepth 1 -type d -exec sh -c 'find "$0" -type f -print -quit' {} \;
```
Em seguida, para pegar apenas o caminho completo dos diretórios listados para usar com o comando mkdir -p, você pode fazer o seguinte:
```bash
find /caminho/do/diretorio -mindepth 1 -type d -exec sh -c 'find "$0" -type f -print -quit' {} \; | xargs dirname
```
Esse comando irá listar apenas os diretórios que contêm arquivos e em seguida pegar o caminho completo desses diretórios para uso com o comando mkdir -p. Espero que isso te ajude!
4. Re: filtrar só as pastas onde tem arquivo [RESOLVIDO]
Enviado em 30/04/2024 - 00:10h
aguamole escreveu:
Aqui esta @Minions, eu escreve o script mas os comentários do script eu coloquei o chatGPT para fazer.
Como você pode ver ela comento muito mau e escreveu frases muito grande, mas vai ficar assim.
Testado e funcionando, se fizer com cat fica mais curto, só que o shell Bash é capas de ler arquivos sem precisar chamar o cat, então eu fiz a tarefa que seria do cat usando built-in do Bash.
Aqui esta @Minions, eu escreve o script mas os comentários do script eu coloquei o chatGPT para fazer.
#!/bin/bash
# Define o comportamento de erro "unbound variable" para terminar o script imediatamente se uma variável não definida for utilizada.
set -u
# Inicia um loop while que vai ler cada linha do arquivo "lista-depastas.txt"
while read lista
do
# Usa o comando sed para remover a última parte do caminho em cada linha do arquivo
# e adiciona o resultado ao array "pastas"
pastas+=($(sed "s,[^/]*$,," <<<"${lista}"))
done <./lista-depastas.txt
# Loop for para percorrer cada elemento do array "pastas"
for cada_linha in "${pastas[@]}"
do
# Cria cada pasta no array "pastas" usando mkdir -p, o "-p" garante que os diretórios pais sejam criados, se necessário.
mkdir -p "${cada_linha}"
done
Como você pode ver ela comento muito mau e escreveu frases muito grande, mas vai ficar assim.
Testado e funcionando, se fizer com cat fica mais curto, só que o shell Bash é capas de ler arquivos sem precisar chamar o cat, então eu fiz a tarefa que seria do cat usando built-in do Bash.
Na leitura de cada linha do arquivo lista-depastas.txt não deveria ter algo no loop while ou no for para identifica se a "variável no momento atual" é uma pasta ou um arquivo?
Pode ocorre o problema de criar uma pasta com o nome de um arquivo.
Infelizmente aqui no Debian 6.0.1 32 bit não tem o comando que gera um pacote já instalado.
5. Re: filtrar só as pastas onde tem arquivo
Enviado em 30/04/2024 - 00:26h
Não, não vai acontecer de criar uma pasta com o nome de um arquivo a menos que o caminho do diretório não esteja definido.
Mas como vc pego a lista de diretórios do arquivo control do pacote DEBIAN então não tem problema porque o arquivo control armazena o caminho completo.
Mas se acontecer de receber do arquivo pastas sem o caminho completo isso vai dar uma variável vazia então o mkdir vai dar um erro "mkdir: cannot create directory ‘’: No such file or directory" e o diretório vazio não será criado.
Não, engano meu não precisa ser completo, mas se tiver um caminho como por exemplo "este/teste" o "este" é um caminho então a pasta "este/" será criada no diretório atual.
Mas como vc pego a lista de diretórios do arquivo control do pacote DEBIAN então não tem problema porque o arquivo control armazena o caminho completo.
Mas se acontecer de receber do arquivo pastas sem o caminho completo isso vai dar uma variável vazia então o mkdir vai dar um erro "mkdir: cannot create directory ‘’: No such file or directory" e o diretório vazio não será criado.
Não, engano meu não precisa ser completo, mas se tiver um caminho como por exemplo "este/teste" o "este" é um caminho então a pasta "este/" será criada no diretório atual.
Responder tópico
Entre na sua conta para responder.
