移动除1之外的所有文件

Léo*_* 준영 136 linux bash glob

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

'mv ~/Linux/Old/!Tux.png ~/Linux/New/'
Run Code Online (Sandbox Code Playgroud)

在哪里我将旧东西移到新的东西 - 文件夹除外Tux.png.!-sign代表一种否定.这个工作有一些工具吗?

sth*_*sth 133

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

mv ~/Linux/Old/!(Tux.png) ~/Linux/New/
Run Code Online (Sandbox Code Playgroud)

  • @UnixBasics,试试:〜/ Linux/Old /!(Tux.png | Tux1.png | Tux2.png) (5认同)
  • 对于 ZSH 用户,不要使用 `shopt`(这会给出 `command not found` 错误),将其添加到你的 `.zshrc` 中:`setopt extended_glob` 然后是 [syntax for glob](http://zsh.sourceforge .net/Doc/Release/Expansion.html#Glob-Operators) 也将相应更改。因此使用`mv ~/path/to/source^(exception) ~/path/to/target/folder` 应该做 (2认同)

Léo*_* 준영 90

将以下内容放在.bashrc中

shopt -s extglob
Run Code Online (Sandbox Code Playgroud)

它扩展了正则表达式.然后,您可以移动除一个以外的所有文件

mv !(fileOne) ~/path/newFolder
Run Code Online (Sandbox Code Playgroud)

与其他命令相关的例外情况

请注意,在复制目录中,正向闪存不能在名称中使用,因为线程中注意到为什么extglob除了条件以外都会破坏?:

cp -r !(Backups.backupdb) /home/masi/Documents/
Run Code Online (Sandbox Code Playgroud)

所以Backups.backupdb/在否定之前这里是错误的,我不会在移动目录中使用它,因为使用其他命令和其他可能的例外错误地使用globs的风险.

  • 这实际上是正确的答案.我错了; 幸运的是,我在一个只有少量文件的文件夹中使用过它.以下是有关Masi显示方法的更多信息:http://wiki.bash-hackers.org/syntax/pattern转到"扩展模式语言",您将在此找到更多相关信息.感谢@ paul-whittaker指出这个问题. (3认同)

Joh*_*itb 67

我会选择传统的find&xargs方式:

find ~/Linux/Old -maxdepth 1 -mindepth 1 -not -name Tux.png -print0 | 
    xargs -0 mv -t ~/Linux/New
Run Code Online (Sandbox Code Playgroud)

-maxdepth 1使它不是递归搜索.如果你只关心文件,你可以说-type f.-mindepth 1使它不包括~/Linux/Old路径本身到结果中.适用于任何文件名,包括包含嵌入换行符的文件名.

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

find ~/Linux/Old -maxdepth 1 -mindepth 1 -not -name Tux.png \
    -exec mv '{}' ~/Linux/New \;
Run Code Online (Sandbox Code Playgroud)

  • 赞成,因为它鼓励学习一个强大的工具,find。请注意,对于带有空格的文件,这不起作用。考虑“find -print0 | xargs -0”,否则放弃 xargs:“find [你所说的] -exec mv -t {} ~/Linux/New \;” (2认同)

Joh*_*n T 23

一种快速方法是修改tux文件名,以便移动命令不匹配.

例如:

mv Tux.png .Tux.png

mv * ~/somefolder

mv .Tux.png Tux.png
Run Code Online (Sandbox Code Playgroud)

  • @John T:不,*glob与以dot开头的文件不匹配. (6认同)

Roh*_*bas 17

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

mv `ls -1 ~/Linux/Old/ | grep -v Tux.png` ~/Linux/New/
Run Code Online (Sandbox Code Playgroud)

编辑:

使用反斜杠和ls代替,以防止使用别名,即大多数ls别名为ls --color.

mv `\ls -1 ~/Linux/Old/ | grep -v Tux.png` ~/Linux/New/
Run Code Online (Sandbox Code Playgroud)

谢谢@Arnold Roa


Jul*_*ano 13

对于bash,回答是正确的.这是zsh(我选择的shell)语法:

mv ~/Linux/Old/^Tux.png ~/Linux/New/
Run Code Online (Sandbox Code Playgroud)

需要EXTENDED_GLOB设置shell选项.

  • 如果我们要排除两个文件怎么办? (2认同)

ale*_*lon 13

我发现这对于排除某些文件或目录的简单移动来说更安全,更容易依赖.

ls -1 | grep -v ^$EXCLUDE | xargs -I{} mv {} $TARGET
Run Code Online (Sandbox Code Playgroud)


hlo*_*dal 5

以下不是100%保证的方法,并且根本不应该尝试编写脚本.但有时它足以快速交互式shell使用.像文件文件一样的文件

[abc]*
Run Code Online (Sandbox Code Playgroud)

(它将匹配名称以a,b或c开头的所有文件)可以通过首先插入"^"字符来否定,即

[^abc]*
Run Code Online (Sandbox Code Playgroud)

我有时使用它来匹配"lost + found"目录,例如:

mv /mnt/usbdisk/[^l]* /home/user/stuff/.
Run Code Online (Sandbox Code Playgroud)

当然,如果有其他文件以l开头,我必须在之后处理这些文件.


Arc*_*Tux 5

grep这可以不用这样完成:

ls ~/Linux/Old/ -QI Tux.png | xargs -I{} mv ~/Linux/Old/{} ~/Linux/New/
Run Code Online (Sandbox Code Playgroud)

注意:-I是大写 i 并使ls命令忽略后面列出的 Tux.png 文件。

ls然后,的输出通过管道传输到mvvia xargs,这允许使用 ls 的输出作为 mv 的源参数。

ls -Q只是引用 ls 列出的文件名。


ant*_*bus 5

怎么样:

mv $(echo * | sed s:Tux.png::g) ~/Linux/New/
Run Code Online (Sandbox Code Playgroud)

不过你必须在文件夹中。


Pak*_*kit 5

这可能更简单,更容易记住,它对我有用。

mv $(ls ~/folder | grep -v ~/folder/exclude.png) ~/destination