タイトルが示すように、実行中のディレクトリに影響を与えることなく、ネストされたディレクトリ構造内でスクリプトを実行したいと考えています(出力は、操作対象のファイルが存在する構造内のサブフォルダーに移動します)。
例えば:
home/ (where we use the script)
home/data1/file1.txt
home/data2/file2.txt
home/data3/file3.txt
スクリプトを作成すると、出力は次のようになります。
home/
しかし、出力を次のようにしたいと思います:
home/data1/output1
home/data2/output2
home/data3/output3
これを達成するための最良の方法は何ですか?ご意見をいただければ幸いです。
一般的なケースよりも特定のケースを好む場合に備えて、以下の私のスクリプト。
スクリプトを実行するスクリプト:
#!/bin/bash
# iterate over a NUL-delimited stream of directory names
while IFS='' read -r -d '' dirname; do
# ...then list files in each directory:
for file in "$dirname"/*; do
# ignore directory contents that are not files
[[ -f $file ]] || continue
# run analysis tool
if [[ $file == *.dmp ]]; then
echo $dirname;
./gdp $file;
#ls $dirname;
echo "complete";
continue
fi
done
done < <(find . -type d -print0)
実行するスクリプト:
#!/bin/bash
echo $1;
awk '
/Internet Protocol Version 4, Src:/{ip=$(NF-4)}
/ Time to live/{ttl++}
/ Time to live/{sttl=$NF}
/ User-Agent/{}
/ User-Agent/ && NF>6 {os=$(NF-6)" "$(NF-5)}
/ User-Agent/ && NF<6 {os="\t"}
/ User-Agent/{brow=$NF}
/ User-Agent/{agent++}
/ User-Agent/{stringtemp=sttl"\t"ip"\t"os"\t"brow}
/ User-Agent/{string=(string)"\n"(stringtemp)}
/Windows;/{windows++}
/Linux;/{linux++}
/Solaris;/{solaris++}
/Epoch Time: /{count++}
END{
sub(/\\r.*$/, "", brow);
print os;
print "("count")" > "temp";
print "TTL\tIP\t\tOS\t\tBROWSER";
print string;
print "\nSUMMARY\n\tttl\t=\t"ttl"\n\twindow\t=\t"windows"\n\tlinux\t=\t"linux"\n\tsolaris\t=\t"solaris >> "temp";
}
' $1 > summary_$1;
sort -k2n summary_$1 | uniq > holder;
cat temp > useragents_$1;
cat holder >> useragents_$1;
more useragents_$1;