1.
Uma mudança simples para não morrer nos nomes de arquivo que começam em -
é adicionar --
(significa "agora todas as opções foram dadas, apenas argumentos posicionais restantes") antes dos argumentos do nome do arquivo começarem, por exemplo
rm -- "$path"
ln -s -- "$path_to_keep" "$path"
e assim por diante.
2.
Para contar caracteres alfa ("alfanuméricos" é provavelmente o que você realmente quer) em um nome de arquivo que você poderia fazer
numberofalnum=$(printf -- "$path" | tr -cd [:alnum:] | wc -m)
Para contar a profundidade do caminho, você pode tentar apenas contar as ocorrências de '/' no nome do arquivo. Uma ressalva poderia ser que /home///daniel
é equivalente a /home/daniel
, mas find
não produzirá barras múltiplas desnecessárias, então tudo ficará bem.
depth=$(printf -- "$path" | tr -cd / | wc -m)
Também é possível recolher várias barras executando tr -s /
após printf
. Combinar -s
, -c
e -d
desta forma em uma única invocação não é realmente possível, parece.
Nesse caso, como find
já é usado dessa maneira no script, apenas adicionar um campo :
separado na -printf
output com %d
imprimirá a profundidade diretamente, conforme observado abaixo no comentário .
3a.
Para ler diretórios como argumentos na linha de comando, veja este snippet mínimo:
#!/bin/sh
i=0
while [ $# -ne 0 ]; do
printf -- 'Argument %d: %s\n' "${i}" "${1}"
i=$((i+1))
shift
done
( $i
é apenas um contador para mostrar o que está acontecendo)
Se você envolver sua lógica em um loop while, poderá acessar o primeiro argumento como ${1}
, depois usar shift
, que abre o primeiro item da lista de argumentos e, em seguida, iterar novamente e agora ${1}
é o segundo argumento originalmente. Faça isso enquanto a contagem de argumentos $#
não for 0.
3b.
Para ler os argumentos de um arquivo, coloque-o como
#!/bin/sh
i=1
while read line; do
printf -- 'Argument %d: %s\n' "${i}" "${line}"
i=$((i+1))
shift
done < "${1}"
Dica: em vez de apenas aumentar o recuo e envolver toda a lógica do arquivo dessa maneira, crie funções da lógica atual e chame-as no final do script. Isso permitirá que você escolha facilmente entre dar diretórios como argumentos ou lê-los a partir de um arquivo sem duplicar o código em seu script.
4.
Adicionar
printf 'My descriptive log message for path %s\n' "${path}" >> "${logfile}"
nos blocos lógicos onde você decidiu agir ou não. Defina $logfile
antes para um caminho de log desejado.