2016-03-28 135 views
1

在我的目錄中,我有多個名爲content的文件。我需要使用父目錄的確切名稱重命名它們,將它們移到外面並刪除父目錄。將多個目錄中的文件重命名爲父目錄的名稱

棘手的部分是父目錄名稱格式是a.txt,b.pdf,c.mp3所以文件內容需要重新命名爲content.txt,content.pdf,content.mp3之後移到外面和目錄應該刪除。

ex; 
INPUT 

a.txt/content 
b.pdf/content 
c.mp3/content 

OUTPUT 

a.txt 
b.pdf 
c.mp3 

我用這個查找命令,並給出了所需的回聲輸出我不知道從那裏去哪裏。

find . -type d -not -empty -exec echo mv \{\}/content \{\} \; 

回答

0

保存文件與.bak延伸在中間步驟,然後重命名爲所需的名稱:

find . -mindepth 2 -type f -exec bash -c 'mv "$1" "${1%/*}".bak' _ {} \; \ 
     -exec bash -c 'rm -r "${1%/*}"' _ {} \; && rename 's/\.bak$//' *.bak 

實施例:

% tree              
. 
├── a.txt 
│   └── content 
├── b.pdf 
│   └── content 
└── c.mp3 
    └── content 

% find . -mindepth 2 -type f -exec bash -c 'mv "$1" "${1%/*}".bak' _ {} \; -exec bash -c 'rm -r "${1%/*}"' _ {} \; && rename 's/\.bak$//' *.bak 

% tree 
. 
├── a.txt 
├── b.pdf 
└── c.mp3 
+0

該代碼創建了文件a.txt.bak,b.pdf.bak和c.mp3.bak,但沒有將文件重命名爲原始擴展名 – Learner

+0

@Learner最後的'rename'進行了最後的重命名,例如'a.txt.bak'到'a.txt' ....檢查你是否有'重命名'命令.. – heemayl

+0

我確實有重命名命令。它給出了錯誤無法重命名* .bak *:沒有這樣的文件或目錄。我認爲它正在尋找它不存在的地方的.bak擴展名。 – Learner

0

我只使用一個用於循環在一個小腳本。

#!/bin/bash 
DESTINATION=/home/whatever 
for dir in *; do 
    if [[ -e $dir/content ]]; then 
     mv $dir/content $DESTINATION/conent.${dir##*.} && rm -rf $dir 
    fi 
done 

的& &將確保重命名成功後的目錄只刪除。