2015-07-28 87 views
0

我有一個父母/文件夾與其中的幾個子文件夾。結構:命令移動子文件夾的文件,保持原來的結構

/parent/ 
    /subfolder_1/ 
     - file_1.txt 
     - file_2.txt 
    /subfolder_2/ 
     - file_3.txt 
     - file_4.txt 

現在,我需要遞歸移動父/文件夾的內容爲空parent_tmp/目錄。事情是,我需要保留原始文件夾結構親/。運動後

預期的結果:

/parent/ 
     /subfolder_1/ 
      (empty) 
     /subfolder_2/ 
      (empty) 


    /parent_tmp/ 
     /subfolder_1/ 
      - file_1.txt 
      - file_2.txt 
     /subfolder_2/ 
      - file_3.txt 
      - file_4.txt 

通常情況下,我只想做

mv parent/* parent_tmp 

但是這當然會永久移動子文件夾。

有沒有辦法調整mv命令以保持源目錄的原始結構?

注:

我知道我可以如複製父/parent_tmp,然後刪除父/子文件夾中的文件。這是我的計劃B.

回答

2

你可以複製文件

cp -r parent/* parent_tmp/ 

,或者創建硬鏈接(應該是很多的大文件的速度)

cp -l -r parent/* parent_tmp/ 

,然後刪除原始文件

find parent -type f -delete 

同時保持目錄結構。

+0

此解決方案需要大量的磁盤空間包含大文件。更好的解決方案是複製目錄然後移動所有文件。 – Klaus

+1

@KlausPrinoth剛更新了'cp -l' – melpomene

1

壓縮父文件夾的內容並將其解壓縮到目標文件夾中。

2

可以使用findparentparent_tmp directoroies父:

find parent -type f -exec bash -c 'mkdir -p "parent_tmp/${1%/*}" && 
     mv "$1" "parent_tmp/${1%/*}"' - {} \; 
1

快速和骯髒的:

我不認爲你會發現在mv命令的工具或選項做你想做的事,但你應該可以通過使用find來達到預期的目標:

cd parent && while read file ; do dirname="$(dirname "$file")" ; mkdir -p ../parent_tmp/"$dirname"/; mv "$file" "../parent_tmp/"${file#}"" ; done < <(find . -type f) && cd - 

 

功能

如果使用這個有很多,那麼你可以在上面添加到您的〜/ .basrc像這樣(附加到文件末尾):

alias mvkp=moveandkeep 

moveandkeep() { 

    cd "$1" 
    while read file ; 
    do dirname="$(dirname "$file")" ; 
     mkdir -p "$2"/"${dirname#}"; 
     mv "$file" ""$2"/"${file#}""; 
    done < <(find . -type f) 
    cd - 

} 

現在您可以簡單地執行以下操作:(需要目錄的完整路徑)

mvkp /home/user/parent /home/user/parent_tmp 
+0

什麼是「源代碼」?引用所有變量以適應帶有空格的目錄。好主意在那裏。 –

相關問題