3

コマンドラインで次のコマンドを実行しています。

for DATAFILE in `find dir_name -type f -mtime +10 | egrep -v -e 'archive/'`
do
    echo 'Data file name- ' "$DATAFILE"
    echo 'Base name ' 
    BASENAME=`basename "${DATAFILE}"`
    DESTFILE="${BASENAME}"_`date +"%Y%m%d%H%M%S"`
    echo "Dest file - "$DESTFILE
done

これに対して次の結果が得られます。

Data file name-  DIR_PATH_1/file_1.txt
Base name
Dest file - file_1.txt_20120719041239
Data file name-  DIR_PATH_2/file_2.txt
Base name
Dest file - file_2.txt_20120719041239

同じコマンドをシェル スクリプトに入れて実行すると、次の結果が得られます。

Data file name-  DIR_PATH_1/file_1.txt
DIR_PATH_2/file_2.txt
Base name
Dest file - file_2.txt_20120719040956

Control-M やその他のジャンク文字のスクリプトを確認しました。また、シェル スクリプトに余分な手順はありません (パラメーターもすべてもありません)。

誰かが私を正しい方向に向けることができますか?

ありがとう。

更新 1:

ループに次の変更を加えました。

ついさっき:

for DATAFILE in `find ${ROOT_DIR} -type f -mtime +$DAYS_ARCH | 
                     egrep -v -e 'archive/'`

今:

find ${ROOT_DIR} -type f -mtime +$DAYS_ARCH |
     egrep -v -e 'archive/' | while read DATAFILE

現在は正常に動作しているようです。私はまだこれを確認するためにテストしています。

更新 2:

FOR ループから WHILE ループに変更すると、問題が修正されました。しかし、なぜこれが起こっているのか、まだ理解できません。誰?

4

2 に答える 2

1

スクリプトに追加します。

echo "My shell is: " $0
echo "My IFS is:" $IFS

対話型シェルの結果と比較します。

hashbang行を追加して、必要なスクリプトによってスクリプトが実行されるようにします。

man shによると、IFS は次のように定義されています。

入力フィールド区切り記号。通常、これは ⟨space⟩、⟨tab⟩、および ⟨newline⟩ に設定されます。詳細については、空白の分割セクションを参照してください。

于 2012-08-09T07:40:29.030 に答える
1

バックティックで出力をキャプチャfindすると、すべての行が効果的に結合されます。これにより、スペースが埋め込まれたファイル名が壊れます。

DATAFILEのfind ${ROOT_DIR} -type f -mtime +$DAYS_ARCH | egrep -v -e 'archive/'

while read ... 空白やその他の特殊文字が含まれている場合でも、ループは一度に 1 つのパス名を読み取ります。

于 2012-08-10T00:04:45.983 に答える