将多个目录中的文件重命名为父目录的名称
问题描述:
在我的目录中,我有多个名为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" "${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
答
我只使用一个用于循环在一个小脚本。
#!/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
的& &将确保重命名成功后的目录只删除。
该代码创建了文件a.txt.bak,b.pdf.bak和c.mp3.bak,但没有将文件重命名为原始扩展名 – Learner
@Learner最后的'rename'进行了最后的重命名,例如'a.txt.bak'到'a.txt' ....检查你是否有'重命名'命令.. – heemayl
我确实有重命名命令。它给出了错误无法重命名* .bak *:没有这样的文件或目录。我认为它正在寻找它不存在的地方的.bak扩展名。 – Learner