183

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

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

我将旧东西移动到新东西文件夹的地方,除了Tux.png. !-符号表示否定。有什么工具可以完成这项工作吗?

4

14 回答 14

164

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

mv ~/Linux/Old/!(Tux.png) ~/Linux/New/
于 2009-03-22T02:53:55.270 回答
111

将以下内容放入您的 .bashrc

shopt -s extglob

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

mv !(fileOne) ~/path/newFolder

与其他命令相关的异常

请注意,在复制目录时,不能在线程中注意到的名称中使用正向闪存Why extglob except break except condition?

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

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

于 2009-04-25T14:26:54.493 回答
76

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

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

-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 \;
于 2009-03-22T04:06:19.900 回答
33

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

例如:

mv Tux.png .Tux.png

mv * ~/somefolder

mv .Tux.png Tux.png
于 2009-03-22T02:52:37.520 回答
31

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

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

编辑:

将反斜杠与 ls 一起使用以防止将其与别名一起使用,即大多数情况下 ls 被别名为 ls --color。

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

谢谢@Arnold Roa

于 2016-12-23T11:35:15.250 回答
17

对于 bash,某事的答案是正确的。这是zsh(我选择的 shell)语法:

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

需要EXTENDED_GLOB设置 shell 选项。

于 2009-03-22T03:00:27.717 回答
15

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

ls -1 | grep -v ^$EXCLUDE | xargs -I{} mv {} $TARGET
于 2011-04-29T01:01:45.510 回答
6

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

[abc]*

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

[^abc]*

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

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

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

于 2009-03-29T00:40:33.223 回答
6

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

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

于 2020-03-21T04:01:57.173 回答
5

怎么样:

mv $(echo * | sed s:Tux.png::g) ~/Linux/New/

不过,您必须在文件夹中。

于 2019-01-09T10:37:38.347 回答
4
mv `find Linux/Old '!' -type d | fgrep -v Tux.png` Linux/New

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

于 2009-03-22T02:55:17.997 回答
4

这可以在没有grep这样的情况下完成:

ls ~/Linux/Old/ -QI Tux.png | xargs -I{} mv ~/Linux/Old/{} ~/Linux/New/

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

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

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

于 2018-06-25T18:23:23.320 回答
3
ls ~/Linux/Old/ | grep -v Tux.png | xargs -i {} mv ~/Linux/New/'
于 2014-12-16T06:26:44.590 回答
0

例如,将所有文件(不包括文件除外)移动到 except_file
find -maxdepth 1 -mindepth 1 -not -name except_file -print0 |xargs -0 mv -t ./except_file
(缓存是当前文件除外)
find -maxdepth 1 -mindepth 1 -not -name cache -print0 |xargs -0 mv -t ./cache

于 2020-10-12T02:15:31.720 回答