Gli*_*ide 11 command-line scp rename
有没有一种办法mv,cp或任何文件操作,这样我可以指定我的所有文件不希望影响?
例如,假设我有一个文件的文件夹file1,file2以及file3,我想移动file1和file2地方。与其明确命名要移动的文件 ( 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是的推广cp和scp使用非常强大的包含/排除规则。例如,以下命令将除*.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)