首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Shell脚本,以使文件夹中的目录与模式匹配。

Shell脚本,以使文件夹中的目录与模式匹配。
EN

Unix & Linux用户
提问于 2021-02-04 23:27:08
回答 1查看 239关注 0票数 2

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

  1. 我需要在Adobe目录中找到与模式匹配的所有文件夹( /Applications/ Photoshop CC)。
  2. 然后,我在一个具有匹配/Applications/Adobe Photoshop CC ????/Dummy-test/Test/的最高年份的目录中创建一个文件夹,例如Test
  3. 之后,我将文件夹PSD/private/tmp/com.example.test/PSD移到Test /Applications/Adobe Photoshop CC 2021/Dummy-test/Test/文件夹中。
  4. 我想说明一下,文件夹Test可能也是早些时候创建的。

下面是示例文件夹结构:

代码语言:javascript
运行
复制
Applications
|
|--- Adobe Photoshop CC 2015.5
|--- Adobe Photoshop CC 2019
|--- Adobe Photoshop CC 2021
|--- Adobe Photoshop CC 2014

我试过了

代码语言:javascript
运行
复制
#!/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/

还有这个

代码语言:javascript
运行
复制
#!/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脚本的书籍建议?)。我需要这个脚本,所以有经验的帮助将不胜感激。谢谢。

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2021-02-04 23:49:47

/Applications/Adobe\ Photoshop\ CC\ *枚举所需的Adobe Photoshop CC目录。但是/Applications/Adobe\ Photoshop\ CC\ */Dummy-test/Test枚举现有的Test目录。将通配符传递给将创建给定文件的命令无法工作。您需要将该指令分开,以枚举现有文件和指令,以创建新文件。

在第二次尝试中,删除等号周围的空格。赋值不能在等号的两边有空格。而且,除非Dummy-test已经存在,否则INSTALL_DIRS不会有任何结果。

代码语言:javascript
运行
复制
#!/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在默认情况下是安装并保持最新的。

代码语言:javascript
运行
复制
#!/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/
票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/632725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档