如何将当前文件夹中的所有文件移动到子文件夹?


69

我在路上:

/myuser/downloads/

然后创建一个子文件夹:

/myuser/downloads/new

现在,我想将下载文件夹中的所有文件和文件夹/子文件夹移动到子文件夹中。

我怎样才能做到这一点?

我试过了:

mv -R *.* new/

但是move似乎并没有采用-R开关。


4
您不需要-R。只是mv * new尽管,它会发牢骚“无法从新到新”或类似的东西。也许mv -i * new对您来说可以防止覆盖。

Answers:


100

命令

mv !(new) new

应该可以。如果不起作用,shopt -s extglob请先运行。

要还移动隐藏的文件/目录(以点开头),也shopt -s dotglob请先运行。
因此,总结一下:

shopt -s extglob dotglob
mv !(new) new
shopt -u dotglob

(最好设置dotglob为避免出现意外情况)。


5
你能提到什么意义!(something)吗?
2016年

2
@adeer只是不说(某事)。换句话说,复制所有内容,但不复制任何内容。像泥一样清澈?
RockyMountainHigh

4
非常。您是否知道zsh的等效功能?
Adeerlike

1
我不明白,例如,如果我尝试将文件夹的内容移动dev到当前位置,我是否必须执行mv !(dev) dev?我知道了-bash: !: event not found
黑色

5
@adeer非常相似。setopt extendedglob在zsh中设置扩展的glob模式。^是排除符号,因此mv ^new new可以解决问题。然后查看可以在zsh中使用的所有选项,setopt并禁用扩展的glob模式,可以这样做unsetopt extendedglob
T先生先生

10

我发现了类似的内容,但比较容易理解,它也可能对您有效:

ls | grep -v new | xargs mv -t new

为上述解决方案添加说明:

从手册页:

  • mv -t

    -t, --target-directory=DIRECTORY
          move all SOURCE arguments into DIRECTORY
    
  • grep -v

    -v, --invert-match
          Invert the sense of matching, to select non-matching lines.
    

分步说明:

  • ls 将列出当前目录中的文件
  • grep -v new 将返回与之不匹配的新管道
  • xargs mv -t new将通过管道传输到它的文件从移动grep -v到目标目录

我尝试了这种方法,但得到了:mv: illegal option -- t。这是因为我正在使用zsh吗?
ConstantFun

@ConstantFun可能是zsh,但我想这是您对的实现mv(这意味着您使用的mv版本与我使用的版本不同)您使用的是什么操作系统?我相信当我写这个答案时,我在Linux发行版上centos使用bash
lockwobr

2
只是在osx上测试,我得到了相同的错误mv: illegal option -- t,这是因为osx的mv没有-t选项。
lockwobr

1
(我没有尝试过,也没有计划。)此链接apple.stackexchange.com/questions/69223/…告诉您如何安装gnucore,这将有助于您获得gnu core cli utils,osx随bsd一起提供cli工具与linux附带的工具不同。
20:51

我正在OSX上运行zsh,所以可能是OS。感谢您的澄清!
ConstantFun

7

简单的想法。假设您位于/ myuser中,将downloads重命名为new,创建一个新的downloads目录,然后将new移入其中。

mv downloads new # downloads is now called new
mkdir downloads # create new directory downloads
mv new downloads # move new into it.

1

如果要将所有文件从文件夹移动到其子文件夹之一,则可以使用以下命令:

find /myuser/downloads/ -type d -name 'new' -prune -type f | xargs mv -t /myuser/downloads/new

它将找到所有文件,然后将它们移动到您的子文件夹。

@waltinator:已添加-type d -name 'new' -prune以防止遍历/myuser/downloads/new


我创建了一个名为的子目录new并试用了此命令,我得到mv: missing file operandTry 'mv --help' for more information
mook765

1

您可以尝试这个替代过程–留在原路

/myuser/downloads/

但是,而不是先建立/myuser/downloads/new/目录,而不是在创建一个文件夹/myuser/目录,用命令mkdir ../new,然后将所有文件downloadsnew,终于移动newdownloads。您可以在/myuser/downloads/路径中使用以下命令在一行中完成此操作:

mkdir ../new && mv * ../new && mv ../new ../downloads

在这种情况下,您不必担心文件/文件夹的任何“过滤”,因为new它与路径处于同一级别downloads,因此您可以将所有内容downloads移至new,然后移至new下载目录。

但是,如果您已经new创建了子文件夹,并且不想创建另一个子文件夹,请不要担心–只需将上面显示的命令中mkdir第一个文件夹左侧的命令更改&&为一个mv命令,然后将其new向上推即可。路径; 换句话说,当您仍在时/myuser/downloads/,可以更改mkdir ../newmv new ..。然后new[路径中的/myuser/downloads/new/] 子文件夹被推到/myuser/new/与相同级别的/myuser/downloads/,然后您可以运行如上所示的其余命令。总而言之,我们从路径开始/myuser/downloads/

mv new .. && mv * ../new && mv ../new ../downloads

并且,由于您要“将下载文件夹中的所有文件和文件夹/子文件夹移动到子文件夹[ new]”,因此您已完成!如果你本来想移动只有文件(或文件夹或[插入更多的颗粒状物体的运动]),那么你就必须使用其他命令,可以“过滤器”对象,如grep。不过,上面编写的命令足以满足您的目的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.