我正在将我的主目录从旧系统迁移到新系统,我制作的 tarball 包含所有内容,包括 .bashrc 等隐藏文件。但是,当我将解压后的 tarball 的内容(位于 /tmp 中)移动到我的新主目录时,隐藏文件不会复制 ( mv /tmp/home/rcook/* /home/rcook/
)。我该如何使用 mv 来移动它们?
实际上,我认为问题不在于 mv,而在于 bash 的通配符。如果我这样做:
mkdir a
mkdir b
touch a/.foo
touch a/bar
mv a/* b/
ls -a a/ b/
我看到的是:
a/:
. .. .foo
b/:
. .. bar
a/.foo
没有动。那么我怎样才能让 * 通配符找到隐藏文件呢?
是的,我想我可以将 tarball 直接解压到我的主目录中,但是 tarball 解压为home/rcook/...
,并且我想确保用.bashrc
旧的、自定义的版本覆盖新的 等,并且知道如何查找和移动隐藏文件是一项有价值的技能。有什么建议吗?
有些答案建议做类似的事情mv src/.* dest/
。但是,我在测试目录中尝试了此操作并出现错误。从以下开始:
rcook$ ls -a a/ b/
a/:
. .. bar .foo
b/:
. ..
rcook$ mv a/.* b/
mv: cannot move 'a/.' to 'b/.': Device or resource busy
mv: cannot remove 'a/..': Is a directory
rcook$ ls -a a/ b/
a/:
. .. bar
b/:
. .. .foo
我究竟做错了什么?
答案1
你可以这样做 :
shopt -s dotglob
mv /tmp/home/rcook/* /home/rcook/
你可以放
shopt -s dotglob
如果~/.bashrc
您希望它成为默认设置。
看http://mywiki.wooledge.org/glob
复制点文件的另一种方法:
mv /tmp/home/rcook/.[!.]* /home/rcook/
不要使用..*
匹配的模式..
(指向父目录)。如果有文件的名称以两个点(..something
)开头,也使用模式..?*
。
答案2
在您的添加中,您遇到了错误,但代码仍然有效。唯一需要补充的是,您告诉它仅有的复制点文件。尝试:
mv src/* src/.* dst/
您仍会收到 . 和 .. 条目的错误,这没问题。但移动应该会成功。
~/scratch [andrew] $ mv from/* from/.* to/
mv: cannot move ‘from/.’ to ‘to/.’: Device or resource busy
mv: cannot remove ‘from/..’: Is a directory
~/scratch [andrew] $ ls -a from/ to/
from/:
. ..
to/:
. .. test .test
答案3
如果您ls -l
在目录中,您将在列出的文件中看到.
和..
。所以,我认为mv .* /dest
要考虑这些指针。尝试:
mv /tmp/home/rcook/{*,.[^.]*,..?*} /home/rcook/
这将忽略当前和父目录指针。
*
如果这三种模式中的任何一种,[^.]*
或者不匹配任何文件,您将收到错误..?*
,因此您应该只包含匹配的文件。
答案4
我知道这已经过时了,但是,有一个简单的方法是:
mv a/{.*,*} b/
解释
这就是所谓的括号扩展。在这种情况下,shell 会通过连接括号前给出的字符串(在本例中为a/
)和括号中给出的列表中的每个变体来扩展您给出的路径。变体列表由逗号分隔的值组成,并且同样由花括号括起来。因此,在本例中,我们有.*
和*
作为元素,因此列表必须是{.*,*}
。
mv a/{.*,*} b/
上述表达式可以这样理解:移动所有以点 ( .*
)开头的文件和将目录中的任何其他内容(*
)a/
复制到目录中b/
。
更多提示
这非常有用,可用于各种场景。例如,假设您必须创建 100 个文件,其命名模式如下:file1、file2、file3...file100。您可以通过以下方式轻松实现
touch file{1..100}
在这种情况下,你会看到范围给出了。您可以通过用两个点 ( ..
) 分隔第一个值和最后一个值来实现此目的。
超越!
我是 Unix 世界的新手,即使知道这在(我迄今为止使用过的 shell)中有效bash
,zsh
但我不能保证这在任何 shell 中都能有效。
您可以查看更多扩展一个通配符在你的 shell 文档中(使用:man bash
或man zshall
,分别代表 bash 和 zsh)。
希望这对未来的读者有帮助!