想要翻转目录结构

时间:2017-06-14 16:18:25

标签: bash

我的目录结构如下:

+ /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 x n目录结构,我想将其切换到n x 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代码来执行此操作?

我知道我实际上只是编写代码来执行此操作,但我认为可能有正式的方法来执行此操作。有点像目录结构的转置。

1 个答案:

答案 0 :(得分:0)

这样做你想要的吗?

  1. 来源吧。
  2. ' testenv'用测试文件设置testdir。
  3. '测试'并检查是否满足您的需求。
  4. 它使用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
    
    }