次のタスクを実行するためにbashスクリプトを作成しようとしています。
- バイナリファイル名を読みます。
- 入力バイナリファイル名に(
A1
大文字B1
と小文字を区別しない)が含まれていることを確認してください。 - 認識された文字列にコピー先
A1
が含まれているかどうかによって異なりdirA/
、それ以外の場合はB1
コピー先が含まれているかどうかによって異なりますdirB/
。
これまでに課題1と2を解決しましたが、課題2の案内が必要です。
答え1
A1
名前に対応する部分文字列を含む現在のディレクトリ内のすべてのファイルをコピーしdirA
(ディレクトリがあると仮定)、その名前に対応する部分文字列を含むすべてのファイルをB1
次の場所にコピーします。dirB
cp ./*A1* dirA/
cp ./*B1* dirB/
または、--
ファイル名オペランドからコマンドラインオプションを分離するには、次の手順を実行します。
cp -- *A1* dirA/
cp -- *B1* dirB/
隠された名前(ドットで始まる名前)を持つファイルは無視されます。これを含める必要がある場合は、コマンドを実行する前にシェルオプションを設定してくださいdotglob
。bash
shopt -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
。