如何使用 mv(或 * 通配符)来移动隐藏文件?

如何使用 mv(或 * 通配符)来移动隐藏文件?

我正在将我的主目录从旧系统迁移到新系统,我制作的 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)中有效bashzsh但我不能保证这在任何 shell 中都能有效。

您可以查看更多扩展一个通配符在你的 shell 文档中(使用:man bashman zshall,分别代表 bash 和 zsh)。

希望这对未来的读者有帮助!

相关内容