我很抱歉,这个问题看上去很愚蠢,但我不能把它搞砸。
我有一堆像这样的文件夹:
/用户/我/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*