バイナリファイル名から特定の文字セットを識別します。

バイナリファイル名から特定の文字セットを識別します。

次のタスクを実行するためにbashスクリプトを作成しようとしています。

  1. バイナリファイル名を読みます。
  2. 入力バイナリファイル名に(A1大文字B1と小文字を区別しない)が含まれていることを確認してください。
  3. 認識された文字列にコピー先A1が含まれているかどうかによって異なりdirA/、それ以外の場合はB1コピー先が含まれているかどうかによって異なりますdirB/

これまでに課題1と2を解決しましたが、課題2の案内が必要です。

答え1

A1名前に対応する部分文字列を含む現在のディレクトリ内のすべてのファイルをコピーしdirA(ディレクトリがあると仮定)、その名前に対応する部分文字列を含むすべてのファイルをB1次の場所にコピーします。dirB

cp ./*A1* dirA/
cp ./*B1* dirB/

または、--ファイル名オペランドからコマンドラインオプションを分離するには、次の手順を実行します。

cp -- *A1* dirA/
cp -- *B1* dirB/

隠された名前(ドットで始まる名前)を持つファイルは無視されます。これを含める必要がある場合は、コマンドを実行する前にシェルオプションを設定してくださいdotglobbashshopt -s dotglob


コマンドラインから1つ以上のファイル名を受け取り、ファイル名に従って正しいディレクトリに移動する必要があるスクリプトに関連する更新された問題を解決します。

これを使用して、case ... esac指定された文字列(ファイル名)がパターンと一致するかどうかをテストし、そのテスト結果に基づいてターゲットディレクトリを設定できます。以下のコードは、パターンが一致しない場合でも警告メッセージを表示します。

#!/bin/sh

for filename do
    case $filename in
        *A1*) destdir=dirA ;;
        *B1*) destdir=dirB ;;
        *)
            printf 'Can not sort "%s", skipping it\n' "$filename" >&2
            continue
    esac

    cp -- "$filename" "$destdir"
done

再びターゲットディレクトリが存在すると仮定します。そうでない場合は、cpコマンドを実行する前にを使用して生成する必要がありますmkdir -p -- "$destdir" || exit

関連情報