![如何合并名称中仅有大小写不同的目录?](https://linux22.com/image/1612600/%E5%A6%82%E4%BD%95%E5%90%88%E5%B9%B6%E5%90%8D%E7%A7%B0%E4%B8%AD%E4%BB%85%E6%9C%89%E5%A4%A7%E5%B0%8F%E5%86%99%E4%B8%8D%E5%90%8C%E7%9A%84%E7%9B%AE%E5%BD%95%EF%BC%9F.png)
一些云存储服务允许将选定的目录下载为 ZIP 存档。但似乎在其中一个服务中,存档包含同一目录的不同大小写版本。例如,如果我Books
在云中存储了一个目录,则存档可能有两个条目:Books
和books
,这两个条目可能都包含一些数据 - 一个目录中有几个文件,另一个目录中有其他文件,因此文件总数与云中的文件总数相同。并且这个问题在整个目录树中递归发生。
我见过的所有情况都仅将目录分为不超过两个版本:1)正确命名,2)全部小写。
我想在提取此 ZIP 存档之后(或过程中)合并目录,以便对于每对大小写不同的目录,我仅获得正确命名的目录及其所有原始数据以及来自其全小写的姐妹目录的数据。
有什么简单的方法可以做到这一点?
答案1
要将所有目录合并为小写,一种方法是递归遍历所有目录并将它们合并为小写对应项。遍历需要以深度优先模式进行,这样当您合并两个目录时,它们的内容已经标准化。
下面的脚本也许能完成这个工作:
find . -depth -name '*[[:upper:]]*' -type d -execdir sh -c '
source=$0
target=$(echo "$source" | tr "[:upper:]" "[:lower:]")
if [ "$source" != "$target" ]; then # need to rename or merge
if [ -d "$target" ]; then
# merge $source (mixed- or uppercase) into $target (lowercase)
find "$source" -mindepth 1 -maxdepth 1 -exec mv -bt "$target" {} +
rmdir "$source"
else
mv "$source" "$target"
fi
fi
' {} \;