2015-10-20 91 views
1

我在每個文件夾下都有一個名爲「thumbs」的子文件夾的文件夾。我需要在每個子文件夾下用「拇指」更改「拇指」子文件夾名稱。SSH以遞歸方式將所有子文件夾名稱更改爲特定名稱

我試圖

find . -type d -exec rename 's/^thumbs$/thumb/' {} ";" 

和我運行這個殼,當我是一個包含所有子文件夾裏面的文件夾,這些子文件夾中的每一個包含需要用「拇指被改名爲「拇指」文件夾」。

嗯,我跑了那個命令和shell留了很多時間思考,然後我給了一個CTRL + C停止,但我檢查並沒有文件夾在當前目錄下重命名,我不知道我是否重命名目錄之外的文件夾我在,有人可以告訴我,我的代碼錯了嗎?

+0

請將您的問題移至[su]。這是[off-topic](http://stackoverflow.com/help/on-topic)。 –

+0

我不知道如何移動,我搜索了但我找不到信息。 –

+0

在這裏刪除,重新發布。 –

回答

0

目標1:如果只有一層深度,將子文件夾「拇指」更改爲「拇指」。

示例輸入:

./foo1/thumbs 
./foo2/thumbs 
./foo2/thumbs 

解決方案:

find . -maxdepth 2 -type d | sed 'p;s/thumbs/thumb/' | xargs -n2 mv 

輸出:

./foo1/thumb 
./foo2/thumb 
./foo2/thumb 

說明:

使用find給你所有的「大拇指」文件夾僅一個級深。輸出到sedp選項打印輸入行,其餘的sed命令將「拇指」更改爲「拇指」。最後,管道到xargs-n2選項告訴xargs從管道使用兩個參數並將它們傳遞給mv命令。

問題:

這不會趕上更深的子文件夾。您不能簡單地在此處使用深度,因爲find會打印來自頂部的輸出,並且因爲我們在mv之前用sed替換東西,所以mv將導致更深的子文件夾發生錯誤。例如,./foo/thumbs/thumbs/將不起作用,因爲mv將首先處理./foo/thumbs並使其成爲./foo/thumb,但隨後下一個輸出行將導致錯誤,因爲./foo /拇指/拇指/不再存在。

目標2:要更改所有子文件夾「拇指」到「拇指」不管有多深。

示例輸入:

./foo1/thumbs 
./foo2/thumbs 
./foo2/thumbs/thumbs 
./foo2/thumbs 

解決方案:

find . -type d | awk -F'/' '{print NF, $0}' | sort -k 1 -n -r | awk '{print $2}' | sed 'p;s/\(.*\)thumbs/\1thumb/' | xargs -n2 mv 

輸出:

./foo1/thumb 
./foo2/thumb 
./foo2/thumb/thumb 
./foo2/thumb 

說明:

使用find爲您提供所有「拇指」子文件夾。將輸出傳送到awk以打印每個路徑中'/'的數目加上原始輸出。 sort輸出數字,反過來(把最深的路徑放在最上面)的數目'/'。將排序後的列表管理到awk以刪除每行的計數。輸出到sedp選項打印輸入行,其餘的sed命令找到上一個發生「拇指」,並且只將其更改爲「拇指」。由於我們按照從最深到最淺的順序對排序列表進行處理,因此這將爲mv提供正確的命令。最後,管道到xargs-n2選項告訴xargs從管道使用兩個參數並將它們傳遞給mv命令。

+0

好,非常感謝你.. –

相關問題