在腳本中命令 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 -

相關內容