jgr*_*tty 6 linux file-transfer bash-scripting
我很抱歉这似乎是一个愚蠢的问题,但我不能把它搞砸。
我有一堆这样的文件夹:
/users/me/foo/oops1
/users/me/foo/oops2
/users/me/foo/oops3
/users/me/foo/oops4
/用户/我/富人/酒吧
不幸的是,它们并没有统一命名,并且有数百个 oops 文件夹。
我打算将所有 oops 文件夹复制到 bar 中。有没有一种简单的方法可以将所有 oops 文件夹移动到 bar 中,而不会导致某种递归移动问题?
复制文件花了几个小时。我希望行动会快得多。
顺便说一下,这是在 redhat linux 服务器上。我只有 ssh 访问权限。
我想如果我这样做
cd foo
mv * bar
Run Code Online (Sandbox Code Playgroud)
会有问题。
小智 7
你的提议完全正确。mv足够聪明,会说:
mv: cannot move `bar' to a subdirectory of itself, `bar/bar'
Run Code Online (Sandbox Code Playgroud)
但是,您所有的 oopsx 目录都将在 bar 内。
不幸的是,马特的答案和妮可的答案都表现出糟糕的风格,如果任何文件夹甚至包含单个空白字符、通配字符(如*)或换行符,就会中断。运行for item in $(ls \xe2\x80\xa6)是一个可能犯的巨大错误,因为它迟早会咬住它们,并且迭代文件名,不正确输出它们可能会导致各种麻烦。
永远不要解析ls.
Linux 中有一个工具可以查找符合特定条件的文件,它的名字是find:
find . -mindepth 1 -maxdepth 1 \\\n-type d ! -regex ".\\/bar$" \\\n-exec mv \'{}\' ./bar/ \\;\nRun Code Online (Sandbox Code Playgroud)\n\n这会将当前工作目录中未调用的任何目录移动bar到./bar/. 即使目录名称包含空格、通配符或换行符,它也能工作。
正则表达式.\\/bar$将仅匹配名为 的目录./bar,并且它被 否定!。