소스 디렉터리의 폴더에 있는 파일에서 다른 디렉터리로 심볼릭 링크를 생성하는 스크립트를 작성하는 방법

소스 디렉터리의 폴더에 있는 파일에서 다른 디렉터리로 심볼릭 링크를 생성하는 스크립트를 작성하는 방법

저는 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패턴과 일치하는 이름이 없으면 진단 메시지와 함께 쉘이 종료되도록 동일한 방식으로 쉘 옵션을 설정할 수 있습니다.

관련 정보