Localizar e copiar com xargs não funciona em um script

0

Eu preciso encontrar três arquivos de um diretório enorme e copiá-los para outro diretório.

Isso é o que eu fiz:

find $adir -type f \( -name "a1*" -o -name "a2*" -o -name "a3*" \) -mtime -8 | xargs cp -t $bdir

O arquivo a1 é copiado para o destino, mas outros arquivos não são copiados para o destino. Este é o meu script:

#!/bin/bash
date=$(date)
day=$(date +"%u")
adir=/x/y
bdir=/a/b
 {
      if [ "$day" == "5" ] ; then
         find $adir -type f \( -name "a1*" -o -name "a2*" -o -name "a3*" \) -mtime -8 | xargs cp -t $bdir
       else
           echo "failed"
       fi
    }

Estou executando isso em um script e o cursor não retorna ao terminal. Existe alguma maneira de fazer isso funcionar?

    
por Innov 25.08.2017 / 14:21

2 respostas

0

Tente remover os colchetes. Este comando funciona para mim direcly no terminal e em um shell bash (cp alterado para 'arquivo' para verificar se funciona ..):

 find . -type f -name "a4*" -o -name "d1*" -o -name "f2*" -mtime -8 | xargs file

Você também pode tentar um loop for, que pode lhe dar mais espaço (loop) para fazer thigs. Altere a linha find com

for a_file in 'find $adir -type f \( -name "a1*" -o -name "a2*" -o -name "a3*" \) -mtime -8'
do
   cp -t $a_file $bdir
done

Você pode reproduzir removendo -mtime -8 e alterar cp -t $a $bdir de echo "The file is: " $a_file para testes ...

    
por 25.08.2017 / 14:45
0

Como discutido, seu script parece sintaticamente e gramaticalmente correto, então deve haver algo fora do próprio script que faça com que ele se comporte da maneira que ele faz.

Dito isto, posso dar-lhe a minha opinião sobre o roteiro. Esta é a maneira que eu teria escrito o equivalente:

#!/bin/sh

day=$(date +'%u')
adir='/x/y'
bdir='/a/b'

case "$day" in
    5)  find "$adir" -type f -mtime -8 -name 'a[123]*' -exec cp {} "$bdir"/ ';'
        ;;
    *)  printf 'Error: Unhandled day "%s"\n' "$day" >&2
        exit 1
esac

Isso apenas usa o fato de que os vários nomes que você deseja combinar podem ser correspondidos por um único padrão de globalização de nome de arquivo. Ele também não depende do GNU cp e da sua opção -t (livrou-se de xargs ). E como não está usando nenhum "bashisms", pode ser interpretado por /bin/sh .

O case ... esac é mais fácil de ler (e escrever) do que um monte de if ... then ... elif .

    
por 25.08.2017 / 19:46