Como excluir arquivos / diretórios do find usando o argumento do programa no bash?

1

Meu achado parece muito simples:

find . -type f

Estou tentando descobrir como excluir determinados arquivos ou diretórios, dependendo da linha de argumento do programa.

bash myscript.sh -excl a b c d 

Em que a, b, c, d ou qualquer próximo argumento da opção excl é uma expressão regular referente a determinados arquivos ou diretórios que desejo excluir.

Então, se eu chamei o programa dessa maneira:

bash myscript.sh -excl *.sh somedir

Eu simplesmente quero ignorar algum diretório e todos os arquivos com extensão .sh . Isso é possível em bash?

    
por user219940 09.03.2017 / 10:05

2 respostas

2

Sim, você pode adicionar apenas um -not -name se houver um segundo argumento ao seu script:

#!/bin/bash 

targetDir="$1"
exclude="$2"

findString=" '$targetDir'"

if [[ ! -z "$exclude" ]]; then
        findString="$findString -not -name '$exclude'"
fi
eval "find $findString"

Por exemplo:

$ ls
file1  file1.sh  file2  file2.sh  file3.sh  file4.sh  file5.sh
$ foo.sh .
.
./file1
./file2
./file1.sh
./file4.sh
./file3.sh
./file5.sh
./file2.sh
$ foo.sh . '*sh'
.
./file1
./file2

Se você quiser definir vários padrões para excluir:

#!/bin/bash 

targetDir="$1"
findString=" '$targetDir'"
shift
exclude="'$1'"
shift
for i in "$@"; do
        exclude="$exclude -a -not -name '$i'";
done
if [[ ! -z "$exclude" ]]; then
        findString="$findString -not -name $exclude"
fi
eval "find $findString"
    
por 09.03.2017 / 10:42
2

Solução usando bash matrizes:

#!/bin/bash

declare -a find_arguments=( -type f )

for arg; do

  find_arguments+=( ! -name "$arg" )

done

find . "${find_arguments[@]}"

Se você realmente quer regex, altere -name para -regex , mas, do seu exemplo, parece que você deseja globbing. (BTW, -regex não é POSIX, mas suportado pelo GNU find .)

Demo

touch {a,b,c}{x,y,z}
./myscript.sh 'a*' '*z'

Saída:

./bx
./by
./cx
./cy

Deixei de fora a análise de linha de comando para -excl e como você não deixou claro como as opções de linha de comando do seu script geralmente se parecem, se é realmente apenas -excl , você pode simplesmente verificar ( [[ "$1" = -excl ]] ) e, em seguida, shift .

    
por 09.03.2017 / 10:40