我有一个包含以下文件的目录
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 1
aaa*.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