Alguém pode me explicar como esse script funciona?

0

Eu estava procurando por um script que alterasse o nome do arquivo e do diretório para minúsculas e substituísse todos os espaços em branco por "-". Consegui encontrar o script abaixo em outro script, mas não entendo como isso funciona. Eu realmente apreciaria se alguém pudesse me guiar por isso.

find ./* -depth -type d -exec sh -c '
t=${0%/*}/$(printf %s "${0##*/}" | tr "[:upper:]" "[:lower:]");
[ "$t" = "$0" ] || mv -i "$0" "$t"
' {} \;
    
por Alex 01.02.2018 / 17:47

3 respostas

2
find ./* -depth -type d -exec sh -c ' ... ' {} \;

find s todos os diretórios ( -type d ) na árvore e executa esse fragmento de shell para cada um deles, com $0 definido para o nome atual. -depth faz com que processe o conteúdo de cada diretório primeiro e o diretório em si. (caso contrário, a renomeação estraga as coisas.)

t=${0%/*}/$(printf %s "${0##*/}" | tr "[:upper:]" "[:lower:]");

${0%/*} remove a última barra e tudo depois dela de $0 , ou seja, deixa o nome do diretório. ${0##*/} é basicamente o oposto. (Eles são tipos de expansão de parâmetro ) O printf | tr é usado para alterar a parte final do nome para minúsculas. O resultado é atribuído a t . ( $(...) é substituição de comando )

[ "$t" = "$0" ] || mv -i "$0" "$t"

Tests para ver se o novo nome em t e o nome antigo em $0 são os mesmos, e se não , chama mv neles.

As partes tolas aqui são que find poderia ser chamado apenas de find . -depth ... , não há necessidade do caractere curinga de nome de arquivo ( find ./* ), pois localizar os nomes dos arquivos é o que find faz. Se eles usassem -execdir em vez de -exec , não haveria necessidade de lidar com a parte do diretório dos nomes dos arquivos. E usar $0 para o nome do arquivo de destino é um pouco ruim, é para o nome do próprio script.

Você mencionou renomear arquivos e diretórios e alterar o espaço em branco para traços. Tanto quanto eu posso ver, o comando aqui não faz nenhum. find -type d apenas pega diretórios, você precisaria usar -type f para capturar apenas arquivos regulares ou deixá-los de fora para ignorar o tipo. Além disso, não há nada sobre o espaço em branco no tr , mas você pode alterá-lo para, digamos, tr "[:upper:][:space:]" "[:lower:][-*]" para também alterar todos os espaços em branco para traços.

    
por 01.02.2018 / 18:44
0

Eu usaria larry walls rename , está disponível em muitas distros. Incluindo Debian e provavelmente derivados.

rename -E 's/-//g' -E 's/(.*)/\L$1/g' *

A primeira expressão s pesquisa e substitui - por nada. segunda expressão procura e substitui tudo (.*) com a mesma coisa $1 mas convertido para minúscula \L

    
por 01.02.2018 / 18:05
0

O script que você apresenta faz algumas coisas para extrair o diretório e alterá-lo para minúsculas. Não há alteração de white space para - .

Para alterar o espaço para - e diminuir a string, o sed funciona bem:

sed -e 's/[[:space:]]/-/g' -e 's/\(.*\)/\L/'

Então, esse script deve funcionar:

find ./* -depth -type d -execdir sh -c '
t=$(printf %s "${1}" | sed -e 's/[[:space:]]/-/g' -e "s/\(.*\)/\L/")
[ "$t" = "$1" ] || echo mv -i "$1" "$t"
' sh {} \;

Usar -depth e -execdir evita a necessidade de extrair o nome da pasta.
O type d limita os elementos selecionados apenas aos diretórios.

    
por 01.02.2018 / 19:48

Tags