web-dev-qa-db-ja.com

ベース名で余分なオペランドエラーが発生する

次のスクリプトを使用して、mergecapコマンドを使用していくつかのpcapファイルを1つにマージしています。しかし、実行すると'basename: extra operand /mnt/md0/capture/DCN/dcn_2014_02_04_00_11_47_598.pcap'エラーが発生しますスクリプトは次のとおりです

#!/bin/bash
#find last 15 files older than +5 days
FILES=$(find /mnt/md0/capture/DCN/ -maxdepth 1 -type f -name "*.pcap"  -mtime +5 -print0 | xargs -0 ls -lt | tail -15 | awk '{print $8}')

N=15
TAG1=$(basename ${FILES[0]} | sed 's/.pcap//')
TAG2=$(basename ${FILES[$N-1]} | sed 's/.pcap//')
#merge the files
mergecap -w /mnt/md0/capture/DCN/"${TAG1}_to_${TAG2}".pcap ${FILES[@]}
Sudo chmod +rw /mnt/md0/capture/DCN/"${TAG1}_to_${TAG2}".pcap 
#delete originals
Sudo rm  ${FILES[@]}
1
Jishnu U Nair

FILES=$(command)は、FILESという名前の変数をcommandの出力を含むスカラーに設定します。

_${FILES[0]}_は、そのスカラー変数の内容になります。この場合、15個の空白で区切られたファイル名を含む文字列であり、15個のフィールドに分割されます。

FILESを配列にしたいようです。そのためには、FILES=( $(command) )を使用します。

シェル変数アクセスを二重引用符(_"${FILES[0]}"_ではなく_${FILES[0]}_)で囲むこともお勧めします。これにより、シェルに空白がある場合にコンテンツがフィールドに分割されなくなります。

4
Mark Plotnick