Bash:特定のパターンでファイルを移動する

Bash:特定のパターンでファイルを移動する

私は一連のzipファイルを繰り返し抽出し、特定のファイル名パターンと一致するファイルだけが別のフォルダに移動するスクリプトを作成しました。

スクリプト:

#!/bin/bash

ARCHIVE_FILEMASK="????-??-??_E_MDT_0_0.7z"
FILEMASK="?????????_?????_A_?_????????????????-?????????"
extractDir=/path/to/dir
dest=/path/to/dest

for f in ${ARCHIVE_FILEMASK}
do
    7z e -aoa -o"${extractDir}" "$f"
    if [ $? != 0 ]
    then
        mv "${extractDir}/${FILEMASK}".xml "$dest"
    fi
done

スクリプトの実行中にエラーが発生しました:

mv: cannot stat `/path/to/dir/?????????_?????_A_?_????????????????-?????????.xml': No such file or directory

nullglobとextglobを開こうとしましたが、役に立ちませんでした。シェルから直接コマンドを実行すると、正常に実行されます。同様の質問がある他の投稿からの回答も役に立ちませんでした。

編集する: Paweł Rumianがディレクトリ名のスペースに問題がある可能性があると述べた後、AVJのプロンプトを試み、コマンドset +xの前にmv

結果:

+ mv '/path/to/dir/????????????????????????_A_?_????????????? ???????-??????????? ??.xml '/パス/to/dest

だから今、一重引用符を削除する必要があります。どうすればいいのかご存知ですか?

ベストアンサー1

一般に、変数拡張の周りに二重引用符を使用することをお勧めします。$foo外側の引用符は、「値を取得してfooスペースで除算し、各結果の単語が1つ以上のファイルと一致する場合はそれをワイルドカードパターンに拡張する」ことを意味するためです。foo特に、変数にファイル名が含まれている場合は必要な値です。ただし、ここでは実際にファイル名を使用するときに拡張しようとしているので、引用符fooで囲んで使用しないでください。別々のパターンのリスト。この変数の値にスペースがないため、ここでは何の違いもありません。"$foo"ARCHIVE_FILEMASKFILEMASK

変数fextractDirインクルードファイル名があるため、二重引用符を保持する必要があります。

for f in ${ARCHIVE_FILEMASK}
do
    if 7z e -aoa -o"${extractDir}" "$f"; then
        mv "${extractDir}/"${FILEMASK}.xml "$dest"
    fi
done

Bashを使用しているため、ワイルドカードパターンがファイルと一致しない場合は、shopt -s nullglobワイルドカードパターンを空のリストに展開するように呼び出すことができます。コマンドにソースファイルを渡さないと、"${extractDir}/"${FILEMASK}.xmlコマンドmvはファイルの欠落について文句を言います。一致するものが1つ以上ある場合にのみ呼び出すことで問題を解決できます。

shopt -s nullglob
for f in ${ARCHIVE_FILEMASK}
do
    if 7z e -aoa -o"${extractDir}" "$f"; then
        matches=("${extractDir}/"${FILEMASK}.xml)
        if ((${#matches[@]})); then
            mv "${matches[@]}" "$dest"
        fi
    fi
done

1以上は通常表示されているものと同じですIFS

おすすめ記事