我正在嘗試透過建立 Linux 腳本(Bash)將檔案按模式排序為檔案名稱。
我的檔案主要是 .JPG,一些 .AV 和 .MP4。我無法使用元標記,因為該檔案的標記已損壞(從 RAID 崩潰中復原)。
我的大部分檔案都附有這樣的標籤 Seaxxx_A01_xxx.jpg 或 Beach_xxx_A01A02_xxx.jpg 或 Mountain_xxx_A04A12_xxx.jpg (這是我對拍攝照片和裝置的參考,即:相機、反射等...)。
我的需要是根據文件名將文件放入正確的資料夾和子資料夾中。
我認為這樣完成這個任務:
使用find,找出模式[AZ][0-2][0-6]或[AZ][0-2][0-6][AZ][0-2][0-6],當這個模式找到之後,查找檔案名稱的第一個部分(即大海、海灘、山、家庭等...,始終作為第一個單字放置,通常我之前沒有其他任何內容)並使用第一部分來查找一個具有相似名稱的資料夾並將其放入(如果我的文件包含:Sea_Royan_xxx_A04A10_xxx.jpg 並且我只有一個名為“Sea”的資料夾,則必須將其放入其中)。
在每個資料夾上,都存在子資料夾,例如A01、A02、A03、A04 或Dio、Sandy、Mael 等...並且我想要目前找到的檔案(即與用於放入父資料夾Sea的文件相同)山等...)檢查上面列出的第二個模式,用於放置正確的子資料夾。
事實上,更簡單的是,我需要:查找文件,找到後,檢查文件名並使用兩種模式將其移動到正確的資料夾和子資料夾中。
讓我知道如何做到這一點(我知道如何根據模式查找文件,但不知道如何讀取當前找到的文件名,並在此文件名上檢查兩個模式以用作正確的路徑),如果您有更多最簡單的方法或更好的方法請隨時告訴我!
答案1
這是一種可能的方法,但它可能不是最美麗的也不是最原始的。這個想法是在 awk 中使用正規表示式從檔案名稱中提取相關位元。然後我們繼續在 awk 中建立 shell move (mv) 命令。最後,我們使用 awk 中可用的系統命令來執行該命令並將檔案移至正確的子資料夾中。
首先嘗試這樣做以獲得詳細的描述:
find . -mindepth 1 -maxdepth 1 -type f | awk '{ filename=$0; match(filename, "^([^_]+).*_(A.*)_", capture); folder=capture[1]; subfolder=capture[2]; cmd=("mv " "" filename " " folder "/" subfolder); print "Command to be run: ", cmd }'
結果:
Command to be run: mv ./Seaxxx_A01_xxx.jpg ./Seaxxx/A01
Command to be run: mv ./Mountain_xxx_A04A12_xxx.jpg ./Mountain/A04A12
Command to be run: mv ./Beach_xxx_A01A02_xxx.jpg ./Beach/A01A02
若要實際執行命令,請在語句末尾新增 system(cmd):
find . -mindepth 1 -maxdepth 1 -type f | awk '{ filename=$0; match(filename, "^([^_]+).*_(A.*)_", capture); folder=capture[1]; subfolder=capture[2]; cmd=("mv " "" filename " " folder "/" subfolder); print "Command to be run: ", cmd; system(cmd) }'
您可能想要的一件事是根據您的需求調整正規表示式。我假設您熟悉正規表示式,這裡我們捕獲檔案名稱的兩個部分。捕獲組括在括號內。
從檔案名稱的開頭開始,我們抓取所有非底線的內容,直到找到一個底線。然後我們繼續尋找,直到找到模式 A######,其中 # 代表字母/數字(第二個捕獲組)。我們捕獲直到按下下一個底線。