如何編寫一個腳本來創建在源目錄中的文件夾中找到的文件到另一個目錄的符號連結
我對 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
這沒關係,因為我可以省略腳本的某些部分。先感謝您。
#!/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 終止並顯示診斷消息。