将多个目录中的文件重命名为父目录的名称

时间:2016-03-28 05:40:07

标签: bash directory find rename mv

在我的目录中,我有多个名为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命令并给出了所需的回声输出,我不确定从那里开始。

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我只是在一个小脚本中使用for循环。

#!/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

&&将确保仅在重命名成功后删除该目录。