Linux

如何將許多不同的子文件夾下移一級?

  • October 11, 2017

我在以下結構中有大量文件,所有文件都在 /base/ 中,然後是 4 個帶有 2 個“隨機”字母的文件夾,然後是一系列相互關聯的文件。

例子:

/base/ab/12/13/37/file1.txt
/base/ab/12/13/37/file2.txt
/base/ab/12/13/37/file3.txt
/base/cd/b8/e2/a1/other1.txt
.... 
/base/cd/b8/e2/a1/other52.txt
/base/af/f3/45/9e/third1.txt
/base/af/f3/45/9e/third2.txt

ETC

我想保留大部分結構,但在最後添加一個 ADDITIONAL (extra_folder) 文件夾,我的文件屬於該文件夾。這樣上面就變成了:

/base/ab/12/13/37/extra_folder/file1.txt
/base/ab/12/13/37/extra_folder/file2.txt
/base/ab/12/13/37/extra_folder/file3.txt
/base/cd/b8/e2/a1/extra_folder/other1.txt

我希望我需要一個 shell 腳本和 move 命令。

非常感謝你。

這是我們開始的:

$ tree base/
base/
|-- ab
|   `-- 12
|       `-- 13
|           `-- 37
|               |-- file1.txt
|               |-- file2.txt
|               `-- file3.txt
|-- af
|   `-- f3
|       `-- 45
|           `-- 9e
|               |-- third1.txt
|               `-- third2.txt
`-- cd
   `-- b8
       `-- e2
           `-- a1
               |-- other1.txt
               `-- other52.txt

12 directories, 7 files

首先我們添加新目錄:

$ find base -type d -mindepth 4 -maxdepth 4 -exec mkdir {}/extra_folder ';'

我們同時使用-mindepth 4-maxdepth 4僅在第四層創建新目錄。如果沒有 ,-mindepth 4我們將獲得更高級別的新目錄,並且沒有-maxdepth 4新目錄本身將被新目錄填充,直到路徑名變得太長以至於find無法再創建更多。

extra_folder目錄是通過mkdir呼叫 from創建的-exec。現在我們有

$ tree base/
base/
|-- ab
|   `-- 12
|       `-- 13
|           `-- 37
|               |-- extra_folder
|               |-- file1.txt
|               |-- file2.txt
|               `-- file3.txt
|-- af
|   `-- f3
|       `-- 45
|           `-- 9e
|               |-- extra_folder
|               |-- third1.txt
|               `-- third2.txt
`-- cd
   `-- b8
       `-- e2
           `-- a1
               |-- extra_folder
               |-- other1.txt
               `-- other52.txt

15 directories, 7 files

然後我們將文件下移:

$ find base -maxdepth 5 -type f -execdir mv {} extra_folder ';'

這將查找目錄中或目錄下的任何正常文件base(我假設只有最低級別的文件)位於第 5 級。然後它用於在找到的文件所在的目錄中-execdir執行命令(將是找到的文件的基本名稱)。mv``{}

我們最終得到

$ tree base/
base/
|-- ab
|   `-- 12
|       `-- 13
|           `-- 37
|               `-- extra_folder
|                   |-- file1.txt
|                   |-- file2.txt
|                   `-- file3.txt
|-- af
|   `-- f3
|       `-- 45
|           `-- 9e
|               `-- extra_folder
|                   |-- third1.txt
|                   `-- third2.txt
`-- cd
   `-- b8
       `-- e2
           `-- a1
               `-- extra_folder
                   |-- other1.txt
                   `-- other52.txt

15 directories, 7 files

一氣呵成:

$ find base -type f \
   -execdir sh -c '[ ! -d "$1" ] && mkdir "$1"; mv "$2" "$1"' sh 'extra_folder' {} ';'

這會找到所有正常文件並將它們移動到一個名為的目錄extra_folder中,而不管它們從哪裡開始。多次執行此命令將使它們進一步向下移動。

被呼叫的小腳本-execdir

[ ! -d "$1" ] && mkdir "$1"
mv "$2" "$1"

這將使用文件夾名稱 as$1和文件名 as 呼叫,$2如果文件夾不存在,將創建該文件夾,然後將文件移動到其中。

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