如何删除子目录但保留内容?求Bash命令实现音乐文件归集
批量将子目录中的音乐文件移至主目录并清理空目录
嘿,这个需求太常见了,手动搬确实麻烦,用Bash命令就能高效解决,我给你两个可靠的方案,还会提醒你关键的避坑点:
方案1:用find命令快速完成(安全防覆盖)
这是最直接的方法,适合大多数情况,尤其是你想避免同名文件被覆盖的场景:
首先切换到你的music目录(把路径换成你实际的目录路径):
cd /home/yourname/music
然后执行移动命令:
find . -type f -exec mv -n {} . \;
find . -type f:递归查找当前目录下所有的文件(包括所有子目录里的)-exec mv -n {} . \;:把找到的每个文件移动到当前目录,-n参数是核心——如果遇到同名文件,不会覆盖原有文件,只会保留最早的那一个,避免误删重要文件
最后删除所有空的子目录:
find . -type d -empty -delete
这条命令会递归删除所有空的子目录,刚好清理掉文件移走后剩下的空文件夹。
方案2:用rsync智能处理重名文件
如果你的子目录里有不少同名文件,想自动给重名文件加后缀(比如song.mp3变成song_1.mp3),那rsync是更好的选择:
# 创建临时目录存放文件 mkdir ./temp # 递归移动所有音乐文件到临时目录,自动处理重名 rsync -a --remove-source-files --include='*/' --include='*.[mp3|flac|wav|ogg]' --exclude='*' . ./temp/ # 把临时目录里的文件移回主目录 mv ./temp/* . # 删除临时目录 rm -r ./temp # 清理空的子目录 find . -type d -empty -delete
--include='*.[mp3|flac|wav|ogg]':这里列出了常见的音乐格式,你可以根据自己的文件格式调整,比如添加aac等--remove-source-files:移动文件而不是复制,完成后原位置的文件会被删除- rsync会自动给重名文件添加序号后缀,不用担心文件被覆盖
关键注意事项
- 操作前一定要备份!建议先把整个music目录复制到其他位置,比如
cp -r /home/yourname/music /home/yourname/music_backup,避免误操作导致文件丢失 - 先测试命令:比如把
mv -n {} .改成echo mv -n {} .,这样会打印出要移动的文件列表,确认没问题再执行实际的移动命令 - 如果有多层嵌套的子目录,这两个方案都能递归处理,不用额外设置参数
内容的提问来源于stack exchange,提问作者user224753
相关产品推荐
相关产品推荐

