スクリプト内のコマンド find と tar

スクリプト内のコマンド find と tar

ユーザーの操作を必要とするスクリプトを作成しようとしています。基本的に、スクリプトはユーザーに 3 つのパラメータを尋ねます。ユーザーが検索したいファイルの名前、ファイルが変更された日数、tar アーカイブの名前です。すべてのパラメータがわかっている場合、スクリプトは適切なファイルを検索し、指定された名前のアーカイブにする必要があります。ターミナルに 1 つのコマンドを入力すると、次のようになります。

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 -

関連情報