Bash

將目錄重組為層次結構

  • October 9, 2012

我有以下類型的文件夾結構,其中包含數千個文件夾。

文件夾名稱是這樣的,具有不同的名稱等

.test
.test.subfolder
.test.subfolder.subsubfolder

.folder
.folder.one
.folder.two
.folder.one.one

我需要實現以下目標:我希望將文件夾重命名,例如從.testtest,然後移動以.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
 }

現在根據您在這裡得到的結果,您只需使用移動命令將文件移動到適當的文件夾中。

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