Usando find -name com tar em um script bash, o que estou fazendo errado? [fechadas]

0

Estou tentando aprender como usar bash scripts; Eu pesquisei as respostas do Google, mas não consigo encontrar uma resposta para o meu problema.

O script é assim:

#!/bin/bash
TIME='date +%b-%d-%y'
FILENAME=backup-$TIME.tar.gz
DESDIR=home/pi/backups
SRC=home/pi/backuplist.txt
find -iname '*.orig' -o -iname '*.py' > home/pi/backuplist.txt
tar -zcvf $DESDIR/$FILENAME $SRC

quando eu executo isso, não cria o backuplist.txt , então não há resultado para usar com tar .

Eu tentei usar find -iname diretamente com tar em um pipeline, mas recebi a resposta -iname command does not exist .

Quando eu uso find para enviar primeiro no terminal e depois usar tar , ele funciona.

O que estou fazendo de errado?

    
por Mårten Ahlberg 16.04.2017 / 20:28

2 respostas

3

Existem dois problemas principais com este script:

  1. Os caminhos são relativos. Isto significa que quando você o executa, assume-se que home/pi existe no diretório atual . Tenho a sensação de que todas as instâncias de home/pi no script devem ser alteradas para /home/pi .

  2. O comando tar provavelmente serve para fazer backup dos arquivos no arquivo backuplist.txt . Do jeito que está escrito agora, você receberá um arquivo tar contendo o arquivo backuplist.txt e nada mais. Se você quisesse ler o conteúdo desse arquivo, use tar -zcvf "$DESDIR/$FILENAME" -T "$SRC" .

  3. Também há variáveis sem aspas no script.

Veja o que eu acho que você quer:

#!/bin/bash

TIME="$(date +%b-%d-%y)"
FILENAME="backup-$TIME.tar.gz"
DESDIR="/home/pi/backups"
SRC="/home/pi/backuplist.txt"

find /home/pi -iname '*.orig' -o -iname '*.py' >"$SRC"
tar -zcvf "$DESDIR/$FILENAME" -T "$SRC"

O /home/pi na linha de comando find é um palpite. Sem isso, eu assumo que o GNU find usaria o diretório atual.

    
por 16.04.2017 / 20:41
2

Acho que esse script ligeiramente diferente atenderá seu desejo original de ter a lista de arquivos canalizada diretamente para tar .

Eu citei as variáveis onde elas são usadas e substituí os backticks '...' pelo moderno $(...) .

Por fim, presumi que você deseja que isso seja executado a partir de / , para que os caminhos usados por você possam existir.

#!/bin/bash
WHEN=$(date +%b-%d-%y)
FILENAME="backup-$WHEN.tar.gz"
DESDIR=/home/pi/backups
SRC=/home/pi/backuplist.txt

mkdir -p "$DESDIR"

cd /
find -iname '*.orig' -o -iname '*.py' |
    tee "$SRC" |
    tar zcvf "$DESDIR/$FILENAME" --no-recursion --verbatim-files-from --files-from -

Você pode omitir completamente as duas linhas que fazem referência a $SRC se você não precisar criar a lista de arquivos durante o processo de backup.

    
por 16.04.2017 / 20:52

Tags