資料夾結構圖:
我對高級 shell 命令和腳本非常陌生。我有基本的終端知識,但以前從未嘗試過創建這樣的自動化。純粹的新手。
我在這篇文章中簡化了我的目標,但實際專案將涉及數千個資料夾。
基本上我有一個來源資料夾和目標資料夾。 Source 資料夾包含前綴為“Car”的目錄,後面跟著“三個數字”
我在來源資料夾中有一個名為 list.txt 的文字文件,它是每行「三個數字」的列表。
我想編寫一個命令或腳本來查找目錄並讀取列表。如果目錄名稱中的最後三位數字與清單中的三位數字相符。我想將匹配的資料夾移動到目標資料夾。
我已經使用 find、-exec mv、xargs、“while IFS read”閱讀了各種方法,但我真的不知道解決此問題的最佳方法。我剛開始,希望這個論壇上有人能插話而不是毆打我。
答案1
Destination
在和的父目錄中運行的腳本Source
(.
在您的圖片中):
#!/bin/sh
while IFS= read -r l; do
mv "Source/Car$l/" Destination/.
done < Source/list.txt
該腳本Source/list.txt
逐行讀取。對於每一行,$l
它都會嘗試將名為 的目錄Source/Car$l
移到Destination/.
。
中的點路徑名元件Destination/.
是一個技巧,以防Destination
不存在。如果Destination
不存在,則第一個mv "Source/Car…/" Destination/
將重命名Source/Car…/
為,Destination/
而不是將其放入其中Destination/
。點有區別:如果目標存在Destination/.
且不Destination/
存在,那麼我們的mv
命令將退出並出現錯誤。
腳本是啞的,它不會對其讀取的內容執行任何健全性檢查Source/list.txt
。例如,如果一行是001/../../../../../../../../../../home/roco/.ssh
,那麼腳本可能會將您的~/.ssh/
目錄移動到Destination/
.如果有空行,則腳本將嘗試移動Source/Car/
。如果最後一行不完整,那麼它將無法到達mv
(請參閱為什麼這個while
迴圈無法辨識最後一行?)。