私はLinuxに初めてアクセスし、バッチファイルを使用してバッチ操作を簡単に実行しました。ソースフォルダ内のフォルダを検索し、ターゲットフォルダ内の各圧縮Zipアーカイブをリンクするシンボリックリンクを作成するスクリプトがあります。
このスクリプトが行うことは、現在のディレクトリを2回離れて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
スクリプトによって生成された各シンボリックリンクは、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
パターンに一致する名前がない場合は、診断メッセージとともにシェルが終了するように、シェルオプションを同じ方法で設定できます。