2017-06-14 43 views
1

我有一個看起來像一個目錄結構:要翻轉目錄結構

+ /root 
    + a 
     + 1/1/2016.csv 
     + 1/2/2016.csv 
     + 12/31/2017.csv 
    + b 
     + 1/1/2016.csv 
     + 1/2/2016.csv 
     + 12/31/2017.csv 
    + c 
     + 1/1/2016.csv 
     + 1/2/2016.csv 
     + 12/31/2017.csv 

等。

我想切換它們是:

+ root 
    + 1/1/2016 
     + a.csv 
     + b.csv 
     + c.csv 
    + 1/2/2016 
     + a.csv 
     + b.csv 
     + c.csv 

所有目錄將有相同數量的文件,所以它是一個M×N的目錄結構,我想將它切換到N×M的目錄結構。

在僞代碼:

For each file_name in a: # since all directories have same file_names 
    initialize file_name_without_csv 
    create_directory, file_name_without_csv, without csv 
    for each directory in root: 
     new_file_name = directory + ".csv" 
     move root/directory/file_name to root/file_name_without_csv/new_file_name 

有一些簡單的方法來做到這一點,或者只是寫一些Python代碼來做到這一點?

我知道我其實可以寫代碼來做到這一點,但認爲可能有一種官方的方式來做到這一點。有點像目錄結構的轉置。

+4

嗯,有沒有一個系統,允許斜槓文件名?我不認爲Unix或Windows可以。那麼,你是否有'/ root/a/1/1/2016.csv'這樣的文件,其中包含月份和日期之間的目錄,或者文件名是否有其他日期分隔符? – ilkkachu

回答

0

這是做你想做的嗎?

  1. 來源。
  2. 'testenv'用測試文件設置testdir。
  3. '測試'並檢查是否滿足您的需求。

它使用ln來避免不必要的複製。如果你想安全起見,在'測試'結束時刪除rm -rf來手動檢查第一個和rm(我推薦它)。我在那裏留下一些回聲以便於評估。

#setup test env 
testenv(){ 
    mkdir swaptest 
    cd swaptest 
    mkdir {a,b,c} 
    touch {a,b,c}/{1_1_2016.csv,1_2_2016.csv,12_31_2017.csv} 
} 

swap(){ 
    for d in $(find . * -type d -depth 1); do 
     echo "dir $d" 
     for f in $(find "$d" -type f -depth 1); do 
      echo "file $f" 
      filename=$(basename "$f") 
      filename_strip=${filename%.*} 
      filename_ext=${filename##*.} 

      if [[ ! -d "$filename_strip" ]]; then 
       mkdir "$filename_strip" 
      fi 
      echo "filename $filename" 
      echo "filename_strip $filename_strip" 
      ln "$f" "$filename_strip"/$(basename "$d")."$filename_ext" 
     done 
     rm -rf "$d" 
    done 

}