aplica um script em uma árvore de subpastas

2

Eu preciso aplicar o seguinte script em uma árvore de subpastas, mas não tenho certeza de como devo chamar esse script para que ele seja executado em todas as subpastas na árvore. Eu só tenho que fazer isso uma vez. Agradecemos antecipadamente.

#!/bin/bash
for file in *.*
do
    [[ -d "$file" || $file =~ _[[:digit:]]{3}\. ]] && continue
    echo -n "Considering $file: " >&2

    extn="${file/*.}"
    versions=()
    keep="$file"

    # Look at matching files
    for version in "${file%.$extn}"_???."$extn"
    do
        [[ -f "$version" ]] || continue

        # Save every one. Identify the current last
        versions+=($version)
        keep="$version"
        echo -n "$version " >&2
    done
    echo "==> keep $keep" >&2

    # Delete them all except the last
    for version in "${versions[@]}"
    do
        [[ "$version" != "$keep" ]] && echo rm -f "$version"
    done
    [[ "$keep" != "$file" ]] && echo mv "$keep" "$file"
done
    
por wade812 03.02.2018 / 20:37

3 respostas

0

Dê um nome ao script acima, vamos supor que ele seja chamado de myrename e esteja localizado no diretório $HOME . Em seguida, use execdir from find para percorrer a árvore:

find /root/of/tree -depth -type d -execdir "$HOME/myrename" \{\} \;

Tente com um myrename como:

#!/bin/bash

echo "directory $1"
    
por 03.02.2018 / 21:56
0

Se o script tiver que ser iniciado no diretório em que ele deve funcionar, você precisará cd ai primeiro. Algo parecido com isto:

find -type d -exec sh -c 'cd -- "$1"; exec /path/to/script.sh' sh {} \;

(mude o caminho para o script, obviamente).

Como alternativa, você pode modificar o script para obter um nome de diretório como argumento, isso deve ser tão simples quanto adicionar um cd ao início do script.

#!/bin/bash
if [ "$1" ]; then
    cd -- "$1" || exit 1
fi
for file in *.*
...

Teste se $1 está vazio no início, para que o comportamento padrão ainda funcione no diretório atual (e não chame acidentalmente cd sem argumentos: ele seria do usuário $HOME ).

E, em seguida, basta executar um find -exec direto com o nome do diretório como argumento para o script:

find -type d -exec /path/to/script.sh {} \;
    
por 04.02.2018 / 11:23
-1

Eu testei pelo método abaixo e funcionou bem

find path  -depth -type d -exec sh /tmp/l.sh {} \;

/tmp/l.sh==> Its the script path
    
por 04.02.2018 / 10:25