解压缩文件后,经常会出现一个目录,其中只包含另一个目录(例如,mkdir foo; cd foo; tar xzf ~/bar.tgz
可能在foo
中除bar
目录外都会产生任何内容)。我想编写一个脚本将其折叠到一个目录中,但是如果嵌套目录中有点文件,它会使事情变得复杂一点。在bash中折叠嵌套的目录
这里有一个天真的实现:
mv -i $1/* $1/.* .
rmdir $1
这里唯一的问题是,它还会尝试移动.
和..
并要求overwrite ./.? (y/n [n])
。我可以通过依次检查每个文件来解决此问题:
IFS=$'\n'
for file in $1/* $1/.*; do
if [ "$file" != "$1/." ] && [ "$file" != "$1/.." ]; then
mv -i $file .
fi
done
rmdir $1
但是,这似乎是一个不雅的解决方法。我试图用find
清洁方法:
for file in $(find $1); do
mv -i $file .
done
rmdir $1
但find $1
也会给$1
结果,其中给出了mv: bar and ./bar are identical
错误。
虽然第二种方法似乎有效,但是有没有更好的方法来实现这一点?
尽管dotglob解决方案比较干净,但find'dir -type f'方法没有什么问题,除了您应该使用'while read .... done <<(find ...)'循环来处理它。 –
我也想移动嵌套的目录,所以我不认为'单独找到dir -type f'就足够了,'find dir -type d'有匹配'dir'本身的问题。 –
如果您只是将给定的'dir'下的所有文件移动到当前位置并在完成时移除'dir',那就不应该成为问题。如果你需要保留一些嵌套的'dirs',那么是的,移动和第二次调用'find dir -type d ...'可能是有序的。 –