问题:
我想复制一个组文件,但不想逐个输入名称$ ls gmail-meta3*
gmail-meta3 gmail-meta3-REC-1558392194-26467821
gmail-meta3-LAB-1558392194-26467821 gmail-meta3-YAD-1558392194-26467821
如何像旧的DOS命令copy gmail-meta3* *.bak之类的东西?
我不想键入:cp gmail-meta3-LAB-1558392194-26467821 gmail-meta3-LAB-1558392194-26467821.bak
答案1:
可以在bash中使用for循环。for f in gmail-meta3* ; do
mv"$f""$f.bak"
done
你也可以使用。rename 's@$@.bak@' gmail-meta3*
$匹配字符串的结尾,因此该命令将.bak放在文件名的末尾。
答案2:
最接近于DOS范例的是mcp (从mmv软件包):mcp 'gmail-meta3*' 'gmail-meta3#1.bak'
如果zsh可用,它提供的zmv模块可能更接近:autoload -U zmv
zmv -C '(gmail-meta3*)' '$1.bak'printf '%s' gmail-meta3* | while IFS= read -r -d '' f; do cp -a --"$f""$f.bak"; done
或者printf '%s' gmail-meta3* | xargs -0 -I{} cp -a -- {} {}.bak
答案3
更好的答案可以用C语言写,cps () {
# cps"Copy Splat", copy group of files to backup, ie"cps Filename .bak"
# copies Filename1 to Filename1.bak, Filename2 to Filename2.bak, etc.
ls"$1"* | while read varname; do cp -a"$varname""$varname$2"; done
}
以问题为例说明问题的工作原理:$ ls gmail-meta3*
gmail-meta3 gmail-meta3-REC-1558392194-26467821
gmail-meta3-LAB-1558392194-26467821 gmail-meta3-YAD-1558392194-26467821
$ cps gmail-meta3 .bak
$ ls gmail-meta3*
gmail-meta3 gmail-meta3-REC-1558392194-26467821
gmail-meta3.bak gmail-meta3-REC-1558392194-26467821.bak
gmail-meta3-LAB-1558392194-26467821 gmail-meta3-YAD-1558392194-26467821
gmail-meta3-LAB-1558392194-26467821.bak gmail-meta3-YAD-1558392194-26467821.bak
注意:这使用-a标志和cp命令保存文件的时间戳,并为你提供更好的备份,例如:rick@alien:~/gmail$ cps Backup .bak
───────────────────────────────────────────────────────────────────────────────────────────
rick@alien:~/gmail$ ll Backup*
-rw-rw-r-- 1 rick rick 87302 Jun 25 05:25 BackupDays
-rw-rw-r-- 1 rick rick 87302 Jun 25 05:25 BackupDays.bak
-rw-rw-r-- 1 rick rick 153 Jun 25 05:44 BackupSets
-rw-rw-r-- 1 rick rick 153 Jun 25 05:44 BackupSets.bak
───────────────────────────────────────────────────────────────────────────────────────────
rick@alien:~/gmail$
注意文件副本的日期和时间与原件完全相同。
相关文章