命令行 mv 排除列表

Gli*_*ide 11 command-line scp rename

有没有一种办法mvcp或任何文件操作,这样我可以指定我的所有文件希望影响?

例如,假设我有一个文件的文件夹file1file2以及file3,我想移动file1file2地方。与其明确命名要移动的文件 ( mv file1 file2 /path/to/destination),我想命名移动的文件并让文件夹中的所有其他文件移动 ( mv --some-switch file3 /path/to/destination)

Gil*_*il' 19

  • 您可以在某些 shell 中使用高级通配模式来匹配目录中的所有文件,但那些匹配特定模式的文件除外。例如,在 ksh、bash 或 zsh 中,命令

    shopt -s extglob   ## needed in bash only
    setopt ksh_glob   ## needed in zsh only
    mv /source/!(*.bak) /destination
    
    Run Code Online (Sandbox Code Playgroud)

    将所有文件移入/source/destination除了匹配*.bak. 在 zsh 中,/source/^*.bak如果您第一次运行,您也可以编写setopt extended_glob,更一般地(再次需要setopt extended_glob/source/*~*.bak(或/source/a*~*.bak名称以a.bak文件等开头的所有文件)。

  • Zsh 有一个批量复制/移动/链接命令,可用于移动除匹配模式之外的所有文件。例如,以下命令移动除*.bakfrom /sourceto之外的所有文件target,并.bak在此过程中添加它们的名称:

    autoload zmv
    zmv '/source/(*)~*.bak' '/target/$1.bak'
    
    Run Code Online (Sandbox Code Playgroud)
  • 有几个命令称为rename浮动。在 Debian 和 Ubuntu 上,/usr/bin/rename是一个 perl 脚本,它将文件移动到由 perl 表达式生成的新名称。如果要排除文件,您可以通过不生成新名称来排除重命名文件。例如,以下命令(使用此特定rename程序)移动除*.bakfrom之外的所有文件/sourceto /target

    rename 's!/source!/target! unless m!\.bak$!' /source/*
    
    Run Code Online (Sandbox Code Playgroud)
  • 您可以使用该find命令来选择要移动的文件。例如,以下命令将除*.bakin/source或子目录之外的所有常规文件移动到/target(注意目录结构已折叠):

    find /source -type f \! -name '*.bak' -exec mv {} /target/ \;
    
    Run Code Online (Sandbox Code Playgroud)

    或者(如果要移动很多文件,效率会更高)

    find /source -type f \! -name '*.bak' -exec sh -c 'mv "$@" "$0"' /target/ {} +
    
    Run Code Online (Sandbox Code Playgroud)
  • rsync是的推广cpscp使用非常强大的包含/排除规则。例如,以下命令将除*.bakin/source或子目录之外的所有文件复制到 中/target,遵守目录结构:

    rsync -a --exclude '*.bak' /source/ /target/
    
    Run Code Online (Sandbox Code Playgroud)
  • pax是(除其他外)另一个cp类固醇。它的排除规则不如 rsync 强大,但它具有在复制文件时重命名文件的附加功能。如果您将文件重命名为空字符串,它将从副本中排除。例如,以下命令将除*.bakin/source或子目录之外的所有文件复制到 中/target,并将文件重命名为.bakin。

    cd /source && pax -rw -pp -s '/.*\.bak$//' -s '/$/.bak/' . /target/
    
    Run Code Online (Sandbox Code Playgroud)

    上面的示例具有创建名为 的目录的不幸副作用foo.bak,可以通过结合find使用来避免这种情况pax

    { cd /source && find . -type f; } | \
    pax -rw -pp -s '/.*\.bak$//' -s '/$/.bak/' /target/
    
    Run Code Online (Sandbox Code Playgroud)