bash スクリプトで tar と find -name を使用するのですが、何が間違っているのでしょうか?

bash スクリプトで tar と find -name を使用するのですが、何が間違っているのでしょうか?

スクリプトの使い方を学ぼうとしていますbashが、答えを Google で検索しましたが、問題に対する答えが見つかりません。

スクリプトは次のようになります。

#!/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

これを実行すると が作成されないbackuplist.txtので、 で使用できる結果はありませんtar

find -inameパイプライン内で直接使用してみましたtarが、応答が返されただけでした-iname command does not exist

find最初にターミナルで出力してから使用するとtar動作します。

何が間違っているのでしょうか?

ここに画像の説明を入力してください

答え1

このスクリプトには主に 2 つの問題があります。

  1. home/piパスは相対パスです。つまり、実行すると、カレントディレクトリhome/piスクリプト内ののすべてのインスタンスを に変更する必要があると感じています/home/pi

  2. このtarコマンドは、おそらくファイル内のファイルをバックアップするためのものですbackuplist.txt。現在の記述方法では、ファイル自体のみtarを含むアーカイブが作成されます。backuplist.txtコンテンツそのファイルの を使用しますtar -zcvf "$DESDIR/$FILENAME" -T "$SRC"

  3. スクリプトには引用符で囲まれていない変数もあります。

あなたが望んでいるものは次のとおりです:

#!/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"

/home/piコマンドラインの は推測findにすぎません。これがなければ、GNU はfind現在のディレクトリを使用すると思われます。

答え2

このわずかに異なるスクリプトは、ファイルのリストを に直接パイプするという当初の要望に対応できると思いますtar

変数が使用されている箇所には引用符を付け、バックティックを`...`最新の$(...)構文に置き換えました。

/最後に、使用したパスが存在できるように、これを から実行することを想定しています。

#!/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 -

$SRCバックアップ プロセス中にファイルのリストを作成する必要がない場合は、参照する 2 行を完全に省略できます。

関連情報