如何将所有同级文件夹移动到一个文件夹中?

如何将所有同级文件夹移动到一个文件夹中?

我很抱歉,这个问题看上去很愚蠢,但我不能把它搞砸。

我有一堆像这样的文件夹:

/用户/我/foo/oops1

/用户/我/foo/oops2

/用户/我/foo/oops3

/用户/我/foo/oops4

/用户/我/foo/bar

不幸的是,它们并没有统一的命名,而且有数百个 oops 文件夹。

我打算将所有 oops 文件夹复制到 bar 中。有没有一种简单的方法可以将所有 oops 文件夹移动到 bar 中,且不会导致某种递归移动问题?

复制文件花了几个小时。我希望移动速度能快得多。

顺便说一下,这是在 Redhat Linux 服务器上。我只有 ssh 访问权限。

我想如果我这么做

cd foo
mv * bar

就会有问题。

答案1

很遗憾,马特的回答妮可的回答两者都表现出糟糕的风格,只要任何一个文件夹包含一个空格字符、通配符(如*)或换行符,就会中断。跑步for item in $(ls …)是人们可能犯的一个巨大错误,因为它迟早会给他们带来麻烦,而且迭代文件名时如果不能正确输出,可能会导致各种各样的麻烦。

永远不要解析ls

Linux 中有一个用于查找符合特定条件的文件的工具,它叫做find

find . -mindepth 1 -maxdepth 1 \
-type d ! -regex ".\/bar$" \
-exec mv '{}' ./bar/ \;

这会将当前工作目录中未调用的所有目录移动到bar./bar/即使目录名称包含空格、通配符或换行符,它也能正常工作。

该正则表达式.\/bar$将只匹配名为 的目录./bar,并且被 否定!

答案2

您的建议完全正确。mv足够聪明,会这样说:

mv: cannot move `bar' to a subdirectory of itself, `bar/bar'

但是,所有 oopsx 目录都将位于 bar 内。

答案3

是的,你是对的,这将是一个问题,因为*也会匹配bar;你不能将mv其目录化到自身中。

技术方法是使用命令替换和循环来mv仅查找不属于的内容bar。例如,在中bash,您可以编写类似这样的内容,但请注意,如果它遇到包含空格的名称,它将失败(因为命令替换会在空格处将内容拆分为单词。)

mv $(for i in *; do if [ $i != "bar" ]; then echo $i; fi; done) bar

但说实话,我很懒。我会mv先把挡路的东西挡开,然后把mv所有东西都放进去,然后再移回去。你只移动文件系统链接,而不是文件内容,所以速度很快。如果你的名字有空格,这种方法也有用。

cd foo
mv bar ../bar.save
mv * ../bar.save
mv ../bar.save bar

答案4

cd 进入 foo

mv -t bar oops[[:digit:]]

更普遍的

mv -t bar oops*

相关内容