ソースディレクトリのフォルダ内のファイルから別のディレクトリにシンボリックリンクを生成するスクリプトを作成する方法

ソースディレクトリのフォルダ内のファイルから別のディレクトリにシンボリックリンクを生成するスクリプトを作成する方法

私はLinuxに初めてアクセスし、バッチファイルを使用してバッチ操作を簡単に実行しました。ソースフォルダ内のフォルダを検索し、ターゲットフォルダ内の各圧縮Zipアーカイブをリンクするシンボリックリンクを作成するスクリプトがあります。

このスクリプトが行うことは、現在のディレクトリを2回離れてprojectsというフォルダに移動し、exampleという別のフォルダに移動し、最後にreleaseというフォルダに移動することです。

公開フォルダ内にはさまざまなフォルダ(例、、など)があり、そのversion 1フォルダversion 2version 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

スクリプトによって生成された各シンボリックリンクは、2つの部分に名前を付ける必要があります。最初の部分はそのリンクがどのフォルダから来たのか、2番目の部分は単にプロジェクトです。したがって、フォルダから来ると、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

ここで使用される2つのタイプのパラメータ置換は次のとおりです。

  • ${variable#pattern}$variable一致する最も短いプレフィックス文字列を削除するために拡張されますpattern
  • ${variable%pattern}、上記と同じですが、プレフィックス文字列の代わりにサフィックス文字列を削除します。

$PWDシェルによって保持される値(現在の作業ディレクトリの絶対パス名)。

nullglobパターンが一致しない場合は、ループが一度実行されないようにスクリプトのシェルオプションを設定しています。この場合、パターンは通常拡張されません。あるいは、failglobパターンに一致する名前がない場合は、診断メッセージとともにシェルが終了するように、シェルオプションを同じ方法で設定できます。

おすすめ記事