配列索引付けに「sed」を使用する

配列索引付けに「sed」を使用する

私は過去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

関連情報