Find funciona bem na linha de comando, mas não funciona no script

1

Eu estou tentando escrever um script em um host Debian Jessie.

Estou com um problema ao tentar executar o seguinte comando (com uma torção) em um script:

find ~/* -path ~/FileSniper* \
-prune -o \
-type f \( -name "*.mp4" -o -name "*.sh" -or -name "*.mp3" \) \
! -name '*.txt' -printf "%f\n"

O que eu estou tentando fazer no script é fazer com que o usuário tenha que digitar os formatos de arquivo que deseja pesquisar, depois disso, canalizo isso para sed , o que garantirá que ele obtenha o direito formato:

 echo "Input the formats like this: \"mp3,mp4,exe,sh\""
        read -p "input:" formats
        formattedformats='echo "-name \"*.""$formats""\"" | sed 's/,/" -o -name "*./g''
        find_parameters=(\(formattedformats\))

Aqui, o $find_parameters conterá algo como:

-name "*.mp3" -o -name "*.mp4" -o -name "*.sh" 

Não consigo descobrir o que há de errado nesta linha:

find ~/* -path ~/FileSniper* -prune -o -type f  "${find_parameters[@]}" ! -name "*.txt" -printf "%f\n" > foundfiles.txt

Eu pesquisei o que pude, mas ainda não consegui descobrir o que está errado. Por favor, me aponte na direção certa.

    
por Martin 09.11.2015 / 03:12

2 respostas

1

Aqui está um script que lê as extensões de arquivo na linha de comando (em vez de usar stdin) e as usa para criar uma expressão regular para usar com a opção find -iregex .

Exclui os diretórios . ocultos e ~/FileSniper* como no seu exemplo original.

#! /bin/bash

regexp=''

for ext in "$@" ; do
    [ -n "$regexp" ] && regexp="$regexp\|"
    regexp="$regexp.*\.$ext$"
done

find ~ -not -path '*/.*' -not -path '*/FileSniper*' -type f \
    -iregex "$regexp" > foundfiles.txt
    
por 09.11.2015 / 04:35
1

Se o seu script é do tipo #!/bin/sh ou é apenas .sh , isso explicaria porque o ${find_parameters[@]} não funciona em um sistema Debian que usa um interpretador dash shell padrão que não implementa a extensão do nome do tipo ${array[@]} .

Também posso ver como o argumento -path ~/FileSniper* pode resultar em resultados indesejados - e o mesmo vale para ~/* . Conforme escrito, essas são expansões de shell - não find de expansões. Os operandos find [ ...paths... ] nunca se expandem e, portanto, ~/* - se for realmente o que você quer - está tão correto quanto possível, mas -path ~/FileSniper* é expandido para quaisquer resultados que possam ser obtidos pelo shell pai antes é usado como padrão por find . E se não corresponder a ~/ é um ponto discutível porque * permanecerá como está, mas se fizer ele não funcionará mais como o padrão que você pretende.

Você deve citá-lo, provavelmente: find ... -path ~/FileSniper\* a menos que você queira procurar literalmente ~ til, caso em que você deve citar isso também.

    
por 09.11.2015 / 14:58