Bash

用於在與模式匹配的文件夾中創建目錄的 Shell 腳本

  • February 10, 2021

我最近有一個任務,但結果比我想像的要難。

  1. 我需要在目錄中找到與模式(Adobe Photoshop CC)匹配的所有文件夾/Applications/
  2. 然後,我在具有最高年份數字匹配的目錄中創建一個文件夾,例如Test/Applications/Adobe Photoshop CC ????/Dummy-test/Test/
  3. 之後,我將文件夾PSD/private/tmp/com.example.test/PSD文件夾Test /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/

顯然,我需要更多地了解該主題才能完成此類任務(也許一些關於 shell 腳本的書籍推薦?)。我需要這個腳本,所以非常感謝有經驗的幫助。謝謝你。

/Applications/Adobe\ Photoshop\ CC\ *列舉Adobe Photoshop CC你想要的目錄。但/Applications/Adobe\ Photoshop\ CC\ */Dummy-test/Test列舉現有 Test目錄。將萬用字元傳遞給將創建給定文件的命令不起作用。您需要將列舉現有文件的指令與創建新文件的指令分開。

在第二次嘗試中,刪除等號周圍的空格。賦值不能在等號兩邊有空格。同樣,除非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 和您控制的系統上執行腳本感興趣,我建議您使用 zsh 而不是 bash。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/

引用自:https://unix.stackexchange.com/questions/632725