私は過去24時間に変更されたディレクトリを検索し、tarを使用して圧縮するシェルスクリプトを作成しています。
フォルダ検索:
find /path to log directory/ -maxdepth 1 -type d -mtime +0
出力例:
/path to log directory/01_05_2016
/path to log directory/02_05_2016
/path to log directory/03_05_2016
/path to log directory/04_05_2016
不要な文字をカットします。
find /path to log directory/ -maxdepth 1 -type d -mtime +0 | tr -d "_" | tr -d "path to log directory"
出力例:
01052016 02052016 03052016 04052016
切り捨てられた文字列を別の配列要素に分割するには、「sed」を使用します。
# Folder search
declare -a array="($(find <0-24 hour directory serach> | <truncate uncecessary character> | sed 's/\([0-9]*\).*/[\1]="\1"/'))"
# Array Printing
echo "Number of Array Elements: "${#array[@]}
echo "array[01052016]: " ${array[01052016]}
echo "array[02052016]: " ${array[02052016]}
echo "array[03052016]: " ${array[03052016]}
echo "array[04052016]: " ${array[04052016]}
出力例
Number of Array Elements: 4
array[01052016]: 01052016
array[02052016]: 02052016
array[03052016]: 03052016
array[04052016]: 04052016
圧縮出力:
LOG_DIR_NAME='<find folder>'
xargs tar -cvzPf /ouput folder/logname.tar.gz /path to log directory $LOG_DIR_NAME
問題の説明:
sedコマンドを使用すると、検索文字列を別々の配列要素に分割できます。このコマンドを使用してください
sed 's/\([0-9]*\).*/[\1]="\1"/'
ここで、[\1]は私の配列インデックスを定義し、"\1"は私の要素を定義します。
希望の出力 インデックス(0〜n)に格納されている配列要素を取得することに興味があります。
array[0]: 01052016
array[1]: 02052016
array[2]: 03052016
array[3]: 04052016
この場合、開始インデックスがわからず、配列インデックスをカスタマイズしたり、配列を繰り返すにはどうすればよいですか?
助けてください
ありがとう
答え1
まず、コマンドを次のように単純化する必要があります。
$ find "/path to log directory/" -maxdepth 1 -type d -mtime +0 | sed 's#.*/##; s#_##g'
01052016
03052016
04052016
02052016
次に配列として保存するには、次の手順を実行します。
array=( $(find "/path to log directory/" -maxdepth 1 -type d -mtime +0 | sed 's#.*/##; s#_##g') )
必要に応じて数値を持つ配列に保存でき、ゼロから始まる増加するインデックスが割り当てられます。
$ for i in {0..3}; do echo "$i : ${array[$i]}"; done
0 : 01052016
1 : 03052016
2 : 04052016
3 : 02052016
つまり、連想配列を繰り返す必要がある場合は、次のようにすることもできます。
$ declare -a array=( "foo"=>"bar" "baz"=>"bad" )
$ for i in ${!array[*]}; do echo "$i : ${array[$i]}"; done
baz : bad
foo : bar