在我的目录中,我有多个名为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 \{\} \;
答案 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
&&将确保仅在重命名成功后删除该目录。