假设我有一个名为“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-awk
regextype 来使用向后引用(\1
)-type d
:目标目录-regex ".*/(.*)/\1$"
:目标文件对应*/bar/bar
-exec sh -c "mv {}/* {}/../"
:将目标目录移动到其父目录-delete
:删除目标目录
注意:不能使用rmdir {}
within -exec
(find
会返回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