使用 shell 脚本复制具有匹配前缀和后缀的文件

使用 shell 脚本复制具有匹配前缀和后缀的文件

我有一个包含以下文件的目录

aaaXXXbbb.png
aaaYYYccc.png
xxxAAAyyy.png
yyyAAAxxx.png

现在我想使用 shell 脚本将所有前缀为 'aaa' 和后缀为 '.png' 的文件复制到新目录,假设 2 个文件 'aaaXXXbbb.png' 和 'aaaYYYccc.png'。

答案1

cp aaa*.png /some/destdir

这将匹配以字符串开头aaa并以字符串结尾的所有文件名.png,并将它们全部复制到目录中/some/destdir。将*匹配名称中间任意数量的任意字符。

如果您有数千个与该模式匹配的文件,则此操作将会失败,因为生成的列表太长。

在这种情况下,请使用类似以下循环的内容:

for name in aaa*.png; do
    cp "$name" /some/destdir
done

这将一一复制文件。

对于数千个文件来说,更有效的方法是(使用 GNUcp及其-t选项):

find . -maxdepth 1 -type f -name 'aaa*.png' -exec cp -t /some/destdir {} +

或者(没有 GNU cp):

find . -maxdepth 1 -type f -name 'aaa*.png' -exec sh -c 'cp "$@" /some/destdir' sh {} +

最后一个命令将查找当前目录下(仅由于)名称与模式匹配的find所有常规文件 ( ) ,并且对于这些文件的批次,它将调用一个简短的内联 shell 脚本。简短的内联 shell 脚本将简单地将当前批次中的文件(这将是合理且可管理的文件数量)复制到目标目录。-type f-maxdepth 1aaa*.png

更多关于find使用-exec了解“find”的 -exec 选项

答案2

你可以用一个衬垫来做到这一点:

grep '^aaa.*\.png$' list.txt | xargs -I '{}' cp '{}' destination_dir/

grep正在行首查找“aaa”,后跟零个或多个字符,并以“.png”结尾。然后它将其作为参数列表通过cp管道传输到“destination_dir”

如果您位于文件目录中,则可以cp使用以下命令:

cp aaa*.png destination_dir

答案3

find

find . -maxdepth 1 -type f -name aaa\*.png -exec cp {} destination \;

.表示当前目录。

-maxdepth 1告诉它只在当前目录中查找

type -f告诉它寻找文件

-name aaa\*.png表示以以下开头aaa和结尾的文件.png

-exec cp {} destination \;将文件复制到名为 的目录中destination

我的环境要求我*使用\.您的可能不需要这个,所以您可以使用aaa*.png

相关内容