Nota: Eu presumi que você está ensinando a si mesmo Bash. Não use este código em produção. find "$directory" -maxdepth 1 -type d
irá te dar os diretórios, -type f
irá te dar os arquivos.
Como está reclamando da linha 16, vamos dar uma olhada:
$dirs='ls $1'
Se você deseja atribuir a uma variável, não inclua o $
. Eu estou supondo que você quis dizer:
dirs='ls $1'
O que está acontecendo agora é:
-
$dirs
provavelmente está vazio, então é substituído por nada. - O comando
ls
é executado e sua saída é substituída no 'comando'. - O primeiro arquivo no seu diretório é chamado
Calibre
, deixando você com o comando:=Calibre x y z ...
-
=Calibre
não é um comando válido, portanto, o erro.
No entanto, ainda não chegamos lá: isso vai dar errado se houver espaços em qualquer um dos nomes de arquivos. Para corrigir isso, você precisa fazer mais:
- Você precisa incluir
IFS=$'\n'
em algum lugar antes do loopfor
. Isso define o separador de campos para o caractere de alimentação de linha, que impede o loopfor
de dividir os arquivos nos espaços ou guias (é tecnicamente possível que um arquivo tenha um avanço de linha em seu nome de arquivo também: é improvável que você já encontrar tal arquivo e ele não causará problemas sérios neste caso se você se deparar com tal arquivo, mas vale a pena estar ciente da possibilidade caso isso realmente importe). - Para que um nome de arquivo com espaços não se transforme em vários argumentos diferentes para
-f
e-d
, é necessário colocar aspas$i
. (Então:[ -f "$i" ]
e[ -d "$i" ]
. Para suportar diretórios com espaços neles, você deve fazer o mesmo para$1
onde é usado.