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

Rename Files in Multiple Directories to the Name of the Parent Directory

在我的目录中有多个名为 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 \{\} \;

在中间步骤中使用 .bak 扩展名保存文件,然后重命名为所需名称:

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

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

我只想在小脚本中使用 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

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