Linux
如何將許多不同的子文件夾下移一級?
我在以下結構中有大量文件,所有文件都在 /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
如果文件夾不存在,將創建該文件夾,然後將文件移動到其中。