2017-08-08 12 views
1

このコードは、DD-MM-YYYYという名前の形式のファイルを含む一連のフォルダを検索し、YYYY-MM-DDという名前に変更します。ただし、このループは最初の反復で正常に動作しますが、2回目の実行で正規表現は解釈されません。ファイル名変更スクリプトが2回目のループで動作しない

#!/usr/bin/env bash 
WORKING_DIRS=("/directory1" "/directory2") 
for WORKING_DIR in ${WORKING_DIRS[@]} 
do 
echo "WORKING DIRECTORY : $WORKING_DIR" 
echo "--------------------------------------------------------" 
for entry in "$WORKING_DIR"/[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9].doc 
do 
    IFS='/' 
    read -r -a array <<< "$entry" 
    file_name="${array[${#array[@]}-1]}" 
    echo "$file_name" 
    IFS='.' 
    read -r -a file <<< "$file_name" 
    echo "OLD DATE: $file" 
    IFS='-' 
    read -r -a file_split <<< "${file[0]}" 
    day=${file_split[0]} 
    month=${file_split[1]} 
    year=${file_split[2]} 
    new_date="$year-$month-$day" 
    echo "NEW DATE : $new_date" 
    mv "$WORKING_DIR"/"$file_name" "$WORKING_DIR"/"$new_date".doc 
done 
done 
+1

@Inianによる単語分割に配列対象の各エントリになります申し訳ありませんが、私はそれをupvotedが、それは登録する時に十分な担当者を持っていませんでした。ちょうどupvoted。 –

答えて

1

問題は、ループの本体でIFS値の変更が複数回あることです。変更した後は、word-splittingの残りの部分は、変更されたIFSによって実行され、グロブパターンは展開できません。

あなたの問題を解決する必要のある、世界的にそれを修正し、ローカルおよびないreadコマンドに値を渡すことによってそれを避けることができます。それは醜いエラー

for entry in "$WORKING_DIR"/[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9].doc 
do 
    [ -e "$entry" ] || continue 

    # rest of the code following 

(と)

を避けるために、ファイルを処理する前にファイルの存在を確認するために常にあるglobパターンをループで一般的にも

IFS='/' read -r -a array <<< "$entry" 
IFS='.' read -r -a file <<< "$file_name" 
IFS='-' read -r -a file_split <<< "${file[0]}" 

個々の要素が再び分割されるのを避けるため、以下のように配列展開を二重引用符で囲みます。そうではない、IFS

for WORKING_DIR in "${WORKING_DIRS[@]}"; do 
0

スクリプトがなぜ機能しないのかわかりませんが、ディレクトリの内容の例がないと、エラーを再現することは困難です。とにかく、それはかなり単純な仕事のために少し複雑に見えます。簡単にすることができます。条件式の=~演算子を使用します。例:

for n in "$WORKING_DIR"/*.doc; do 
    if [[ $n =~ (.*\/)([0-9][0-9])(-[0-9][0-9]-)([0-9][0-9][0-9][0-9])\.doc ]]; then 
    mv $n ${BASH_REMATCH[1]}${BASH_REMATCH[4]}${BASH_REMATCH[3]}${BASH_REMATCH[2]}.doc 
    fi 
done 
関連する問題