在脚本中命令 find 和 tar

在脚本中命令 find 和 tar

我正在尝试编写一个需要用户交互的脚本。基本上,该脚本必须向用户询问 3 个参数:用户想要查找的文件的名称、文件修改的天数以及 tar 存档的名称。当所有参数已知时,脚本必须找到适当的文件并将它们放入具有给定名称的存档中。当我将单个命令写入终端时:

find -name 'zad*' -mtime -10 | tar -cvf archive.tar.gz -T -

效果很好。如何使用用户输入的变量来调用同一脚本中的命令?我的脚本正在制作一个空档案。

我的脚本:

echo "Enter a number of days"
read days
echo "Enter the name of file"
read nameoffile
echo "Enter the name of tar archive"
read nameofarchive
find -name '"$nameoffile"' -mtime -"$days" | tar -cvf "$nameofarchive".tar.gz -T -

答案1

尝试删除多余的'引号'"$nameoffile"'

例子:

maulinglawns@debian-HP:~$ read nameoffile
myFile
maulinglawns@debian-HP:~$ echo '"$nameoffile"'
"$nameoffile"
maulinglawns@debian-HP:~$ echo "$nameoffile"
myFile

如果您需要单引号,请像这样转义它们:

echo \'$nameoffile\'
'myFile'

答案2

一般来说,需要用户交互是一个非常糟糕的主意。它使您的脚本无法自动化,并且使您的用户很难使用,因为他们需要在不允许制表符完成的环境中手动输入内容。

自从@maulinglawns已经解释过为什么你的脚本失败了,我将为你提供一种更简单的方法,不需要你的用户费力地输入信息:

#!/usr/bin/env sh

days="$1"
nameoffile="$2"
nameofarchive="$3"
find -name "$nameoffile" -mtime -"$days" | tar -cvf $nameofarchive".tar.gz -T -

然后,要查找foo.txt最近 3 天内修改的名为 的文件并将它们存档到 bar.tar.gz`,您可以运行:

script.sh 3 foo.txt bar

您还可以添加一些简单的错误检查,以确保脚本始终使用正确数量的参数运行:

#!/usr/bin/env sh

if [ $# -ne 3 ]; then
    echo "You need to enter three arguments"
    exit 1
fi

days="$1"
nameoffile="$2"
nameofarchive="$3"
find -name "$nameoffile" -mtime -"$days" | tar -cvf $nameofarchive".tar.gz -T -

答案3

read 支持命名变量,例如;

#!/bin/bash

read -p "How many files? (0-100) " VAR_NUMBER_OF_FILES
read -p "How many days? (0-100) " VAR_NUMBER_OF_DAYS
read -p "Tar file name? " VAR_TAR_NAME
...
find -name '"$VAR_NUMBER_OF_FILES"' -mtime -"$VAR_NUMBER_OF_DAYS" | tar -cvf "$VAR_TAR_NAME".tar.gz -T -

相关内容