Boj*_*kić 8 shell bash wildcards rename files
我想备份我的~/.ssh/id_rsa
到id_rsa.old
,看起来它被删除了!这怎么可能?:)
root@localhost:~/.ssh# ls -l
total 16
-rw------- 1 root root 3326 Mar 12 11:22 id_rsa
-rw-r--r-- 1 root root 756 Mar 12 11:22 id_rsa.pub
-rw------- 1 userx userx 666 Mar 8 11:09 known_hosts
-rw-r--r-- 1 userx userx 666 Feb 29 10:53 known_hosts.old
root@localhost:~/.ssh# mv id_rsa *.old
root@localhost:~/.ssh# ls -l
total 12
-rw-r--r-- 1 root root 756 Mar 12 11:22 id_rsa.pub
-rw------- 1 userx userx 666 Mar 8 11:09 known_hosts
-rw------- 1 root root 3326 Mar 12 11:22 known_hosts.old
root@localhost:~/.ssh# touch p
root@localhost:~/.ssh# mv p *.p
root@localhost:~/.ssh# ls -l
total 12
-rw-r--r-- 1 root root 756 Mar 12 11:22 id_rsa.pub
-rw------- 1 userx userx 666 Mar 8 11:09 known_hosts
-rw------- 1 root root 3326 Mar 12 11:22 known_hosts.old
-rw-r--r-- 1 root root 0 Mar 12 11:28 *.p
root@localhost:~/.ssh# rm *.p
root@localhost:~/.ssh# ls -l
total 12
-rw-r--r-- 1 root root 756 Mar 12 11:22 id_rsa.pub
-rw------- 1 userx userx 666 Mar 8 11:09 known_hosts
-rw------- 1 root root 3326 Mar 12 11:22 known_hosts.old
userx@localhost:~$ uname -r
4.2.0-30-generic
userx@localhost:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 15.10
Release: 15.10
Codename: wily
userx@localhost:~$ bash --version
GNU bash, version 4.3.42(1)-release (x86_64-pc-linux-gnu)
Run Code Online (Sandbox Code Playgroud)
hee*_*ayl 32
它已被重命名为known_hosts.old
,因此覆盖了known_hosts.old
.
由于您已经在其中命名known_hosts.old
了一个文件,因此 glob 模式*.old
已扩展为known_hosts.old
.
简而言之,以下几点:
mv id_rsa *.old
Run Code Online (Sandbox Code Playgroud)
已扩展为:
mv id_rsa known_hosts.old
Run Code Online (Sandbox Code Playgroud)
在 中bash
,如果那里没有名为known_hosts.old
存在的文件,它将扩展为文字*.old
(假设您尚未启用nullglob
)。
Gil*_*il' 19
看起来您认为这mv id_rsa *.old
会移动id_rsa
到id_rsa.old
,而*
由第一个参数代替,但事实并非如此。通配符由 shell 扩展,而不是由命令扩展。当mv
看到命令时,shell 已经扩展了通配符。有四种情况:
mv
使用参数id_rsa
和调用*.old
。然后它移动id_rsa
到一个名为的文件*.old
(星号是文件名的第一个字符)。在这种情况下,某些 shell(取决于它们的配置)将显示错误并且不运行命令。mv
移动id_rsa
到那个匹配的文件,覆盖之前的文件。这就是您的情况发生的情况:mv
使用参数id_rsa
和known_hosts.old
,调用known_hosts.old
被覆盖。mv
抱怨,因为除了最后一个文件之外的所有文件都是源文件,将多个文件移动到同一个文件中是没有意义的。mv
将它们视为源文件。为避免mv
意外覆盖目标文件,请提示确认。把它放在你的 shell 初始化中(例如.bashrc
):
alias cp='cp -i'
alias mv='mv -i'
Run Code Online (Sandbox Code Playgroud)
根据现有名称重命名文件,mv
仅凭这一点是没有帮助的。您需要使用其他工具,或安排提供mv
完整的目的地名称。做您想做的事情的一种方法是使用大括号扩展,它可以让您指定具有公共词干的单词。
mv id_rsa{,.old}
Run Code Online (Sandbox Code Playgroud)
shell 将其扩展为mv
使用参数id_rsa
(id_rsa
与空字符串连接)和id_rsa.old
(id_rsa
与 连接.old
)。
要根据模式批量重命名文件,最常用的工具是zmv
(仅限 zsh)prename
和mmv
. 要将表单的所有文件从to重命名,您可以使用id_SOMETHING
id_SOMETHING.old
zmv 'id_*' '$f.old'
mmv 'id_*' 'id_#1.old'
prename 's/$//' id_*
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1206 次 |
最近记录: |