저는 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
이것을 쉘 스크립트로 어떻게 변환합니까? 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
쉘에 의해 유지되는 값입니다(현재 작업 디렉토리의 절대 경로 이름).
nullglob
패턴이 일치하지 않으면 루프가 한 번 실행되지 않도록 스크립트에 대한 셸 옵션을 설정하고 있습니다 . 이 경우 패턴은 일반적으로 확장되지 않습니다. 또는 failglob
패턴과 일치하는 이름이 없으면 진단 메시지와 함께 쉘이 종료되도록 동일한 방식으로 쉘 옵션을 설정할 수 있습니다.