复制目录中的特定文件

复制目录中的特定文件

我正在尝试复制目录中的一些文件。该目录包含以下文件

我当前的目录是~/certificate/

drwxrwxr-x 2 ubuntu ubuntu     4096 Oct 16 11:58 apache
-rw-rw-r-- 1 ubuntu ubuntu     5812 Oct 16 11:20 apache.keystore
-rw-rw-r-- 1 ubuntu ubuntu     1079 Oct 16 08:31 csr.txt
-rwxr-xr-x 1 ubuntu ubuntu 36626564 Oct 16 10:08 my.war
drwxrwxr-x 2 ubuntu ubuntu     4096 Oct 16 09:39 tomcat
-rw-rw-r-- 1 ubuntu ubuntu     6164 Oct 16 09:31 tomcat.keystore

我想将除 my.war 之外的所有文件复制到 ~/certs/。我尝试按照命令执行但没有成功。我不想将 my.war 从文件夹中移出,即使是暂时的。

cp -r ~/certificate/(?!m)* ~/cert/. 

请帮助我使用合适的正则表达式或任何其他工具。

答案1

可移植文件名通配符模式有些限制。无法表达“除此之外的所有文件”。

对于此处显示的文件,您可以匹配第一个字母~/certificate/[!m]*(“所有以非字符开头的文件名m”)或最后一个字母~/certificate/*[^r]

如果您需要微调要复制的文件列表,可以使用find.用于-type d -prune避免递归到子目录。

cd ~/certificates &&
find . -name . -o -type d -prune -o ! -name 'my.war' -name 'other.exception' -exec sh -c 'cp "$@" "$0"' ~/cert {} +

如果您使用 ksh,则可以使用其扩展的 glob 模式。

cp ~/certificates/!(my.war|other.exception) ~/cert

如果您先运行,则可以在 bash 中使用相同的命令shopt -s extglob。如果您先运行,则可以在 zsh 中运行相同的命令setopt ksh_glob。在 zsh 中,有一种替代语法: run setopt extended_glob,然后是其中之一

cp ~/certificates/^(my.war|other.exception) ~/cert
cp ~/certificates/*~(my.war|other.exception) ~/cert

或者,使用带有排除列表的复制工具,例如 pax 或 rsync。 Pax默认是递归的;您可以使用该选项-d复制目录,但不能复制其内容。

rsync --exclude='my.war' --exclude='other.exception' ~/certificates/ ~/cert/

pax -rw -s '!/my\.war$!!' -s '!/other\.exception$!!' ~/certificates/ ~/cert/

答案2

您可以使用此命令:

$ cp -R ~/certificate/[act]* ~/certs/.

我通常会做这样的事情来测试我的外壳球。

$ echo certificate/[act]*
certificate/apache certificate/apache3.keystore certificate/csr.txt certificate/tomcat certificate/tomcat.keystore

shell glob 并不是真正的正则表达式,我相信它们被称为模式。

模式匹配

Bash 中进行模式匹配的工具在 Bash 手册页的标题为以下的部分中有很好的记录:“模式匹配”

答案3

find ~/certificates -type d -name '*' -exec mkdir -p ~/certs/{} \;

移动目录

find ~/certificates ! -filetype f ! -name "my.war" -exec cp "{}" ~/cert \;

移动文件,但不移动 ( !) 那些名为 ( -name) my.war ( "my.war") 且 my.war 周围带有引号的文件,以防止.shell 解释它们。

相关内容