Linux

如何編寫一個腳本來創建在源目錄中的文件夾中找到的文件到另一個目錄的符號連結

  • October 14, 2021

我對 Linux 還很陌生,我已經使用批處理文件輕鬆地執行批處理任務。我有這個腳本,它掃描在源文件夾中找到的文件夾,然後創建一個符號連結,將在其中找到的每個壓縮 Zip 存檔連結到目標文件夾。

腳本所做的是它兩次離開目前目錄,進入一個名為 projects 的文件夾,然後進入另一個名為 example 的文件夾,最後進入一個名為 release 的文件夾。

在發布文件夾中有一堆其他文件夾(即version 1version 2version 3等),在這些文件夾中是一個 Zip 存檔。

腳本的下一部分是遍歷文件夾version 1version 2version 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 終止並顯示診斷消息。

引用自:https://unix.stackexchange.com/questions/673235