Repassa os arquivos retornados do find?

3

Estou tentando montar um script que recursivamente encontre todos os arquivos *.plist em um diretório e, em seguida, opere neles. O script está abaixo, mas está produzindo resultados inesperados.

O resultado esperado é que cada nome de arquivo é impresso como:

File: XXX
File: YYY
File: ZZZ

O problema é que for file in "$FILES" é não enviando um arquivo de cada vez. Em vez disso, está enviando toda a lista de uma só vez ( FILES foi coletada usando find ), então estou recebendo uma saída como:

File: XXX
YYY
ZZZ

A saída real é mostrada abaixo, mas o acima é um resumo preciso dele.

Como eu faço o loop do shell sobre os arquivos individuais na variável FILES ?

#! /bin/sh

do_test_file() {
  FILE="$1"
  echo "File: $FILE"
  # echo 'ls -al "$FILE"'
  echo ""
}

do_test_dir() {
  DIR="$1"
  FILES='find "$DIR" -name "*.plist" 2>/dev/null'

  for file in "$FILES"
  do

    if [ ! -d "$file" ] && [ ! -L "$file" ]; then
      do_test_file "$file"
    fi

  done
}

########################################

ARG="$1"
if [ -z "$ARG" ]; then
  echo "Please invoke with a file or directory to search"
  exit 1
fi

if [ -d "$ARG" ]; then
  do_test_dir "$ARG"
else
  do_test_file "$ARG"
fi
$ ./plist-dump.sh .

File: ./916CD34C-4D41-41B7-9266-2DCAC416E2D1/.com.apple.mobile_container_manager.metadata.plist
./916CD34C-4D41-41B7-9266-2DCAC416E2D1/iTunesMetadata.plist
./916CD34C-4D41-41B7-9266-2DCAC416E2D1/example.app/ResourceRules.plist
./916CD34C-4D41-41B7-9266-2DCAC416E2D1/example.app/Info.plist
./916CD34C-4D41-41B7-9266-2DCAC416E2D1/example.app/Settings.bundle/Root.plist
./916CD34C-4D41-41B7-9266-2DCAC416E2D1/example.app/SC_Info/Manifest.plist
    
por jww 06.02.2015 / 01:34

2 respostas

2

Você criou FILES variáveis com valor único - a saída inteira do find. Uma solução é usar matrizes, como:

FILES=($(find . -name "*.txt" 2>/dev/null))

e mais tarde

for file in "${FILES[@]}"

Note que você deve usar $() para substituição de comandos ao invés de backticks ''.

    
por 06.02.2015 / 02:00
6

Provavelmente você está procurando a função -exec em encontrar-se:

find "${DIR}" -name "*.plist" -type f -exec echo "do some stuff to " {} \;

Quebrando isso:

  • - testes de tipo para garantir que a coisa que encontrou é um arquivo
  • -exec executa o código ....
  • echo "fazer algumas coisas"
  • {} representa o arquivo que está sendo operado durante essa iteração
  • \; fecha o código e retorna para a próxima iteração

Isso pode simplificar seu script.

    
por 06.02.2015 / 03:54

Tags