在 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如果您不需要在备份过程中创建文件列表,则可以完全省略这两行引用。

相关内容