Bash:有条件地移动嵌套的重复目录

Bash:有条件地移动嵌套的重复目录

假设我有一个名为“foo”的目录,其中包含多个目录:

foo/bar/bar/(files)
foo/bat/bat/(files)
foo/baz/qux/(files)

有没有办法有条件地将“最深”目录上移一级,以便只有当其名称与其父级名称匹配时,它才会替换其父级目录?如果不匹配,则目标是保留当前目录结构。

期望输出:

foo/bar/(files)
foo/bat/(files)
foo/baz/qux/(files)

答案1

您可以使用find

find . -regextype posix-awk -type d -regex ".*/(.*)/\1$" -exec sh -c "mv {}/* {}/../" \; -delete
  • -regextype posix-awk:我们需要使用posix-awkregextype 来使用向后引用(\1
  • -type d:目标目录
  • -regex ".*/(.*)/\1$":目标文件对应*/bar/bar
  • -exec sh -c "mv {}/* {}/../":将目标目录移动到其父目录
  • -delete:删除目标目录

注意:不能使用rmdir {}within -execfind会返回No such file or directory错误),需要-delete在 之后使用 option -exec

答案2

未经测试:

DIR=foo
ls $DIR | while read SUBDIR ; do
  [ -d $DIR/$SUBDIR/$SUBDIR ] || continue
  mv $DIR/$SUBDIR/$SUBDIR/* $DIR/$SUBDIR/
  rmdir $DIR/$SUBDIR/$SUBDIR
done

相关内容