在 bash 腳本中使用 find -name 和 tar,我做錯了什麼?

在 bash 腳本中使用 find -name 和 tar,我做錯了什麼?

我正在嘗試學習如何使用bash腳本;我已經用谷歌搜尋了答案,但找不到我的問題的任何答案。

該腳本如下所示:

#!/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在管道中使用 with 但剛剛得到響應-iname command does not exist

當我使用find先在終端中輸出然後使用它時,tar它就有效。

我究竟做錯了什麼?

在此輸入影像描述

答案1

該腳本有兩個主要問題:

  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一個瘋狂的猜測。如果沒有它,我假設 GNUfind將使用當前目錄。

答案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如果您不需要在備份過程中建立文件列表,則可以完全省略這兩行引用。

相關內容