パターンに一致するフォルダ内にディレクトリを生成するシェルスクリプト

パターンに一致するフォルダ内にディレクトリを生成するシェルスクリプト

最近思ったより難しい課題を引き受けることになりました。

  1. パターンに一致するすべてのフォルダを見つける必要があります(Adobe Photoshop CC/Applications/ディレクトリにあります。

  2. 次に、次のフォルダを作成します。テスト、最も高い年番号が一致するディレクトリから/Applications/Adobe Photoshop CC ????/Dummy-test/Test/

  3. その後、フォルダを移動します。PSD/private/tmp/com.example.test/PSDフォルダからテスト /Applications/Adobe Photoshop CC 2021/Dummy-test/Test/

  4. Testフォルダがより早く作成された可能性があることを指摘したいと思います。

サンプルフォルダ構造は次のとおりです。

Applications
|
|--- Adobe Photoshop CC 2015.5
|--- Adobe Photoshop CC 2019
|--- Adobe Photoshop CC 2021
|--- Adobe Photoshop CC 2014

私はこれを試しました

#!/bin/sh

mkdir -p /Applications/Adobe\ Photoshop\ CC\ */Dummy-test/Test
mv /private/tmp/com.example.test/PSD /Applications/Adobe\ Photoshop\ CC\ */Dummy-test/Test/

この

#!/bin/sh

INSTALL_DIRS = (/Applications/Adobe\ Photoshop\ СС\ */Dummy-test)
INSTALL_DIR=${INSTALL_DIRS[$((${#INSTALL_DIRS[@]}-1))]}
mkdir -p "$INSTALL_DIR"/"Test"

mv /private/tmp/com.example.test/PSD /Applications/Adobe\ Photoshop\ CC\ */Dummy-test/Test/

明らかにそのようなことをするには、そのトピックについてもっと知る必要があります(シェルスクリプトのための推奨書籍がありますか?)。このスクリプトが必要なので、経験豊富な助けをいただきありがとうございます。ありがとうございます。

ベストアンサー1

/Applications/Adobe\ Photoshop\ CC\ *Adobe Photoshop CC目的のディレクトリを列挙します。しかし/Applications/Adobe\ Photoshop\ CC\ */Dummy-test/Test、リスト既存の Test目次。特定のファイルを生成するコマンドにワイルドカードを渡すことは機能しません。既存のファイルを列挙するための指示と新しいファイルを生成するための指示を分離する必要があります。

2番目の試みでは、等号の周りのスペースを削除します。代入門では、等号の周りにスペースを入れることはできません。繰り返しますが、Dummy-testすでに存在しない限りINSTALL_DIRS何も出ません。

#!/bin/bash
shopt -s nullglob
photoshop_dirs=(/Applications/Adobe\ Photoshop\ СС\ *)
if ((${#photoshop_dirs[@]} == 0)); then
  echo >&2 "$0: fatal error: Adobe Photoshop CC is not installed."
  exit 1
fi
install_dir=${photoshop_dirs[$((${#photoshop_dirs[@]}-1))]}/Dummy-test/Test
mkdir -p "$install_dir"
mv /private/tmp/com.example.test/PSD "$install_dir/"

説明する:

  • shopt -s nullglobワイルドカードパターンが一致するものがない場合、配列は空になります。デフォルトでは、ワイルドカードパターンが一致するものがないと変更されないため、配列には変更されていないパターンを含む要素が含まれます*
  • 適切なディレクトリがない場合は、停止してエラーメッセージを表示するチェックを追加しました。

macOSと制御するシステムでのみスクリプトを実行することに興味がある場合は、bashの代わりにzshを使用することをお勧めします。 Zshが良く、エラーが少なくなります。 bashの利点は、Linuxにデフォルトでインストールされ、通常* BSDにもインストールされることです。一方、zshは簡単にインストールできますが、通常はデフォルトではインストールされません。 macOSでは、bashは非常に古いバージョンですが、zshはデフォルトでインストールされ、最新のままです。

#!/bin/zsh
setopt null_glob
photoshop_dirs=(/Applications/Adobe\ Photoshop\ СС\ *)
if (($#photoshop_dirs == 0)); then
  echo >&2 "$0: fatal error: Adobe Photoshop CC is not installed."
  exit 1
fi
install_dir=${photoshop_dirs[-1]}/Dummy-test/Test
mkdir -p $install_dir
mv /private/tmp/com.example.test/PSD $install_dir/

おすすめ記事