Verifique o parâmetro de entrada e execute de acordo

0

O script que eu tenho requer duas entradas, uma é a filepath e a outra é filename , que é usada para verificar a existência de um arquivo usando o comando find.

#!/bin/bash

Filepath=$1
Filename=$2

if [ -z "$Filepath" ] && [ -z "$Filename" ]
then
        echo "Requires Input"
elif [ ! -z "$Filepath" ] && [ ! -z "$Filename" ]
then
        Found='find "$Filepath" -iname "$Filename"'
                if [ -z "$Found" ]
                then
                        echo "Not Found"
                else
                        echo $Found
                fi
fi

Isso funciona completamente bem como esperado. Mais tarde tive que adicionar mais algumas condições a este script, ou seja, se obtivermos apenas o filename como parâmetro de entrada, teremos que pesquisar esse arquivo em todo o sistema de arquivos, conforme abaixo

find / -iname "$Filename"

E no caso, se apenas o parâmetro de entrada filepath for passado para esse script, ele terá que repetir que o parâmetro de nome de arquivo também é necessário ou apenas precisa sair.

    
por ramp 28.09.2016 / 16:59

1 resposta

0

Eu faria:

#! /bin/sh -
pattern=${1?Please provide a file name}
shift

[ "$#" -gt 0 ] || set /

find "$@" -iname "$pattern" | grep '^' && exit

echo >&2 "Not found"
exit 1

Ou seja, passe o nome (observe que find o trata como um padrão (insensitivo a maiúsculas por causa de -iname ) para corresponder aos nomes dos arquivos, não como um nome de arquivo exato a ser encontrado ) como o primeiro argumento. Qualquer outro argumento são diretórios ou arquivos para pesquisar e, se nenhum for fornecido, procure em / .

Em vez de armazenar a saída em uma variável e exibi-la no final, use grep como uma passagem e isso informará se um arquivo foi encontrado.

Além disso, estou exibindo a mensagem "Não encontrado" em stderr em vez de stdout e relatando a falha para localizar o arquivo no status de saída.

Como observado por @ Thomas, há o problema comum que você não pode passar nomes de arquivos / diretórios de forma confiável para find . Se você quiser pesquisar em um diretório chamado -delete , chamar that-script name -delete , por exemplo, teria efeitos desastrosos. Com BSDs find , isso pode ser contornado fazendo (antes de chamar find ):

for i do
  set -- "$@" -f "$i"
  shift
done

Portável (embora note que -iname não é portátil), é necessário preceder ./ a caminhos relativos que podem ser problemáticos, como com:

for i do
  case $i in
    (. | ./* | /*) ;; # /foo, ./foo are not a problem
    (*) i=./$i
  esac
  set -- "$@" "$i"
  shift
done
find "$@"...

Isso afeta a saída (como em você verá ./delete/name em vez de -delete/name ).

    
por 28.09.2016 / 17:12