用于在与模式匹配的文件夹中创建目录的 Shell 脚本

用于在与模式匹配的文件夹中创建目录的 Shell 脚本

我最近有一个任务,但结果比我想象的要难。

  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/

显然,我需要更多地了解该主题才能完成此类任务(也许有一些关于 shell 脚本编写的书籍推荐?)。我需要这个脚本,所以经验丰富的帮助将不胜感激。谢谢。

答案1

/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/

相关内容