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 有一个批量复制/移动/链接命令,可用于移动除匹配模式之外的所有文件。例如,以下命令移动除*.bak
from /source
to之外的所有文件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
程序)移动除*.bak
from之外的所有文件/source
to /target
:
rename 's!/source!/target! unless m!\.bak$!' /source/*
Run Code Online (Sandbox Code Playgroud)您可以使用该find
命令来选择要移动的文件。例如,以下命令将除*.bak
in/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
使用非常强大的包含/排除规则。例如,以下命令将除*.bak
in/source
或子目录之外的所有文件复制到 中/target
,遵守目录结构:
rsync -a --exclude '*.bak' /source/ /target/
Run Code Online (Sandbox Code Playgroud)pax
是(除其他外)另一个cp
类固醇。它的排除规则不如 rsync 强大,但它具有在复制文件时重命名文件的附加功能。如果您将文件重命名为空字符串,它将从副本中排除。例如,以下命令将除*.bak
in/source
或子目录之外的所有文件复制到 中/target
,并将文件重命名为.bak
in。
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)