移动所有文件,除了一个

我怎样才能移动所有的文件,除了一个? 我正在寻找类似:

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

我把旧的东西移到新的文件夹,除了 Tux.png。!符号代表否定。有什么工具可以做这项工作吗?

202894 次浏览

一个快速的方法是修改 tux 文件名,使您的 move 命令不匹配。

例如:

mv Tux.png .Tux.png


mv * ~/somefolder


mv .Tux.png Tux.png

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

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

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

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

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

需要设置 EXTENDED_GLOB shell 选项。

我会用传统的 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 \;

以下方法不是100% 保证的方法,根本不应该尝试用于脚本。但有时对于快速交互式 shell 使用来说,它已经足够好了。类似于

[abc]*

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

[^abc]*

我有时会用它来解决不匹配“ lost + found”目录的问题,比如:

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

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

把下面的内容放到你的.bashrc

shopt -s extglob

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

mv !(fileOne) ~/path/newFolder

与其他命令相关的异常

请注意,在复制目录时,正向闪存不能用在线程 除了条件外,为什么除了破坏以外的其他情况?中注意到的名称中:

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

因此 Backups.backupdb/在这里是错误的否定之前,我不会使用它也不会在移动目录,因为使用错误的风险,然后与其他命令和可能的其他异常球。

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

ls -1 | grep -v ^$EXCLUDE | xargs -I{} mv {} $TARGET
ls ~/Linux/Old/ | grep -v Tux.png | xargs -i {} mv ~/Linux/New/'

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

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

没有 grep也可以这样做:

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

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

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

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

这个怎么样:

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

但你必须在文件夹里。

这可能是更简单,容易记住,它为我工作。

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

将所有文件(不包括除了文件以外的文件)移动到除了 _ 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