Bash
將目錄重組為層次結構
我有以下類型的文件夾結構,其中包含數千個文件夾。
文件夾名稱是這樣的,具有不同的名稱等
.test .test.subfolder .test.subfolder.subsubfolder .folder .folder.one .folder.two .folder.one.one
我需要實現以下目標:我希望將文件夾重命名,例如從
.test
到test
,然後移動以.test.subfolder
使文件夾在沒有 的文件夾.subfolder
內,然後在文件夾內並且在.test``.``.test.subfolder.subsubfolder``subfolder``test``subsubfolder``test/subfolder
這需要遞歸,因為有很多文件夾。請記住,文件夾中的文件仍應保持完整。
這是可能嗎?
這個 bash 腳本可以滿足您的需要:
#!/bin/bash for dir in .*/ ; do [[ $dir == ./ || $dir == ../ ]] && continue # Skip the special dirs new=${dir#.} # Remove the dot at the beginning new=./${new//.//} # Replace dots with slashes, prepend ./ new=${new%/} # Remove the trainling slash mkdir -p ${new%/*} # Create the parent dir mv "$dir" "$new" # Move the dir to destination done
是的,這是很有可能的。你需要做的是你需要讀取路徑中的所有文件名並考慮空格、點等如果你想有效地做到這一點,你可以使用這個執行緒:How do I perform an action on all files with a以優雅的方式在子文件夾中進行特定擴展?
現在,一旦您閱讀了路徑名中的文件,您就必須制定一條規則。
例如,讓我們考慮這個結構:
.test .test.subfolder .test.subfolder.subsubfolder
你要做的是你必須計算每個文件名中單詞 sub 的出現次數。因此,如果計數為:0,則為父文件夾,如果計數:1,則為第一級子文件夾,如果計數:3–> 為第二級子文件夾,依此類推(級別從您提供的結構)
因此,可能的虛擬碼如下所示:
if(filename contains(".test")) { searchCount("sub"); if(count ==0) parent(); else if(count ==1) 1stLevelChild();//and so on }
現在根據您在這裡得到的結果,您只需使用移動命令將文件移動到適當的文件夾中。