2016-03-28 131 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 

的& &将确保重命名成功后的目录只删除。