移动除一个以外的所有文件

如何移动除一个以外的所有文件? 我正在寻找像这样的东西:

'mv ~/Linux/Old/!Tux.png ~/Linux/New/' 

在那里我把旧东西移动到除Tux.png之外的新东西 – 文件Tux.png 。 ! – 表示否定。 有工作的工具吗?

如果使用bash并且设置了extglob shell选项(通常是这种情况):

 mv ~/Linux/Old/!(Tux.png) ~/Linux/New/ 

把以下内容放到你的.bashrc中

 shopt -s extglob 

它扩展了正则expression式。 然后您可以移动除一个以外的所有文件

 mv !(fileOne) ~/path/newFolder 

与其他命令有关的例外

请注意,在复制目录中,正如在线程中注意到的那样,forward-flash不能用于名称为什么extglob除了破坏条件之外呢? :

 cp -r !(Backups.backupdb) /home/masi/Documents/ 

所以Backups.backupdb/在这个否定之前是错误的,我不会在移动目录中使用它,因为这样会有其他命令和其他可能的exception使用错误的风险。

我会用传统的find&xargs方式去:

 find ~/Linux/Old -maxdepth 1 -mindepth 1 -not -name Tux.png -print0 | xargs -0 mv -t ~/Linux/New 

-maxdepth 1使它不能recursionsearch。 如果你只关心文件,你可以说-type f-mindepth 1使得它不包含~/Linux/Oldpath本身。 适用于任何文件名,包括那些包含embedded换行符的文件名。

一个评论指出,mv -t选项可能是GNU扩展。 对于没有它的系统

 find ~/Linux/Old -maxdepth 1 -mindepth 1 -not -name Tux.png \ -exec mv '{}' ~/Linux/New \; 

快速的方法是修改tux文件名,这样你的move命令就不会匹配。

例如:

 mv Tux.png .Tux.png mv * ~/somefolder mv .Tux.png Tux.png 

对于bash而言, 答案是正确的。 这里是zsh (我的shell的select)语法:

 mv ~/Linux/Old/^Tux.png ~/Linux/New/ 

需要设置EXTENDED_GLOB shell选项。

我觉得这样更安全,更容易依靠排除某些文件或目录的简单移动。

 ls -1 | grep -v ^$EXCLUDE | xargs -I{} mv {} $TARGET 

我认为最简单的方法就是反引号

 mv `ls -1 ~/Linux/Old/ | grep -v Tux.png` ~/Linux/New/ 

编辑:

使用反斜杠,而不是使用别名,即大多数ls被别名为ls –color。

 mv `\ls -1 ~/Linux/Old/ | grep -v Tux.png` ~/Linux/New/ 

谢谢@Arnold Roa

以下是不是100%保证的方法,不应该尝试脚本。 但是有些时候对于快速的交互式shell使用来说已经足够了。 一个文件文件glob像

 [abc]* 

(将匹配所有名称以a,b或c开头的文件)可以通过先插入“^”字符来取消,即

 [^abc]* 

我有时使用这个不匹配“lost + found”目录,例如:

 mv /mnt/usbdisk/[^l]* /home/user/stuff/. 

当然,如果还有其他的文件以l开头,那么我必须处理这些文件。

 mv `find Linux/Old '!' -type d | fgrep -v Tux.png` Linux/New 

find命令列出所有常规文件,而fgrep命令会过滤掉任何Tux.png。 反引号告诉mv移动生成的文件列表。

 ls ~/Linux/Old/ | grep -v Tux.png | xargs -i {} mv ~/Linux/New/' 

如何移动文件夹中的所有内容,然后将Tux.png移回?

我想不出任何shell语法来说“除了…之外的所有东西”。