我对 Linux 相当陌生,我已经使用批处理文件轻松地执行批处理任务。我有这个脚本,它扫描源文件夹内找到的文件夹,然后创建一个符号链接,将在目标文件夹内找到的每个压缩 Zip 存档连接起来。
该脚本的作用是两次离开当前目录,进入一个名为projects的文件夹,然后进入另一个名为example的文件夹,最后进入一个名为release的文件夹。
发布文件夹内有一堆其他文件夹(即version 1
、version 2
、version 3
等),这些文件夹内有一个 Zip 存档。
脚本的下一部分是遍历文件夹version 1
、version 2
、version 3
等,然后创建在目标文件夹中找到的 Zip 存档的符号文件。
这个 for 循环将继续下去,直到没有剩余的存档文件可以创建符号链接。
脚本看起来像这样,有评论作为指导:
@echo off
REM Sets the location of directories to be used in the script
REM The source folder has more folders inside with compressed ZIP archives
set source=%~dp0..\..\projects\example\release
REM The destination folder is where all the compressed ZIP archives will go to
set destination=%~dp0destination
REM A for-loop in-charge of searching for all compressed ZIP archives inside the folders in the source directory
for /D %%i in ("%source%\*") do (
REM A for-loop that grabs every compressed ZIP archives found inside the folders in the source directory
for %%j in ("%%~fi\*.zip") do (
del "%destination%\%%~ni_%%~nj.zip" >nul 2>nul
REM Creates a symbolic link for each compressed ZIP archive found to the destination directory
mklink "%destination%\%%~ni_%%~nj.zip" "%%j" 2>nul
)
)
REM This creates a new line
echo.
REM Displays an error message that the script is not run as an administrator, and a guide for potential troubleshooting if the script is already run as an administrator
if %errorlevel% NEQ 0 echo *** ERROR! You have to run this file as administrator! ***
if %errorlevel% NEQ 0 echo *** If you are getting this error even on administrator, please create the 'destination' folder ***
REM Prompts the user for any key as an input to end the script
pause
目录结构和内容如下所示:
.
└── Example
└── Release
├── Version 1
│ └── version1.zip
├── Version 2
│ └── version2.zip
├── Version 3
│ └── version3.zip
└── Version 4
└── version4.zip
脚本创建的每个符号链接应分为两部分命名,第一部分是它来自哪个文件夹,第二部分是简单的项目。因此,如果它来自文件夹,则将在目标文件夹中Version 1
调用符号链接。Version 1-project.zip
我该如何将其转换为 shell 脚本?我知道并非 Windows 批处理脚本中的所有功能都不可用,bash
但这没关系,因为我可以省略脚本的某些部分。先感谢您。
答案1
#!/bin/bash
shopt -s nullglob
srcdir=Example/Release
destdir=/tmp
mkdir -p "$destdir" || exit
for pathname in "$srcdir"/*/version*.zip; do
name=${pathname#"$srcdir"/} # "Version 1/version1.zip"
name=${name%/*}-${name#*/} # "Version 1-version1.zip"
ln -s "$PWD/$pathname" "$destdir/$name"
done
上面的脚本假定Example/Release
您在问题中显示的目录结构,并且子目录中的文件与version*.zip
.该循环迭代所有这些version*.zip
文件,并使用文件名和直接父目录的名称构造链接名称。它在目录下创建符号链接$destdir
作为绝对路径名的符号链接。
这里使用的两种类型的参数替换是
${variable#pattern}
,扩展为删除$variable
匹配的最短前缀字符串pattern
。${variable%pattern}
,如上所述,但删除的是后缀字符串而不是前缀字符串。
$PWD
是由 shell 维护的值(当前工作目录的绝对路径名)。
我正在nullglob
为脚本设置 shell 选项,以便在模式不匹配时循环不会运行一次(在这种情况下,模式通常不会展开)。或者,您可以failglob
以相同的方式设置 shell 选项,以便在没有名称与模式匹配的情况下让 shell 终止并显示诊断消息。