移动除1之外的所有文件

时间:2009-03-22 02:44:38

标签: linux bash glob

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

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

我把旧东西移到新的东西 - 文件夹除了Tux.png。 !-sign代表一种否定。这项工作有什么工具吗?

15 个答案:

答案 0 :(得分:126)

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

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

答案 1 :(得分:84)

将以下内容放入.bashrc

shopt -s extglob

它扩展了正则表达式。 然后,您可以通过

移动除一个以外的所有文件
mv !(fileOne) ~/path/newFolder

与其他命令相关的例外

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

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

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

答案 2 :(得分:66)

我会选择传统的发现& 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 \;

答案 3 :(得分:20)

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

例如:

mv Tux.png .Tux.png

mv * ~/somefolder

mv .Tux.png Tux.png

答案 4 :(得分:16)

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

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

答案 5 :(得分:13)

对于bash,sth answer是正确的。这是zsh(我选择的shell)语法:

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

需要设置EXTENDED_GLOB shell选项。

答案 6 :(得分:12)

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

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

答案 7 :(得分:5)

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

这样的文件文件
[abc]*

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

[^abc]*

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

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

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

答案 8 :(得分:4)

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

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

答案 9 :(得分:3)

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

答案 10 :(得分:3)

这样可以跳过grep

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

答案 11 :(得分:2)

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

我想不出任何shell语法来反复说“除了......之外的所有内容”。

答案 12 :(得分:2)

怎么样:

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

不过您必须位于文件夹中。

答案 13 :(得分:2)

这可能更容易记住,并且对我有用。

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

答案 14 :(得分: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