如何获取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 -aa/ b/
我看到了这个:
a/: . .. .foo b/: . .. bar
a/.foo
没动。 那么如何才能获得*通配符来查找隐藏文件?
是的,我想我可以将tarball直接解压缩到我的主目录,但tarball解压缩到home/rcook/...
,我想确保用旧的自定义版本覆盖新的.bashrc
等,并且知道如何查找和移动隐藏文件是一项有价值的技能。 建议?
一些答案建议做一些像mv src/.* dest/
。 但是,我在我的测试目录上尝试了这个并且出错了。 从…开始:
rcook$ ls -aa/ 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 -aa/ b/ a/: . .. bar b/: . .. .foo
我究竟做错了什么?
你可以这样做 :
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
)开头的文件,也可以使用模式..?*
。
在你的添加中,你有错误,但代码仍然有效。 唯一要添加的是你告诉它只复制点文件。 尝试:
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
如果你在目录中使用ls -l
,你会看到.
和..
列出的文件。 所以,我认为mv .* /dest
会考虑这些指针。 尝试:
mv /tmp/home/rcook/{*,.[^.]*,..?*} /home/rcook/
这将忽略那些当前和父目录指针。
如果三种模式*
, [^.]*
或..?*
中的任何一种都不匹配任何文件,则会出现错误,因此您应该只包含匹配的模式。
我能想到的两种可能的解决方案。 第一种是使用cp代替其递归选项,将当前目录复制到目标。
cp -Rp . /desired/directory
然后您可以删除当前目录中的源文件
或者,如果您知道这些文件的名称是合理的(没有空格,通配符,不可打印的字符),您可以执行以下操作:
mv $(ls -A) /desired/directory
Linux上没有“隐藏”文件这样的东西。 默认情况下,以点开头的文件只是从文件列表中隐藏。
要使用glob复制文件,您需要为文件添加前缀.
例如mv -u .* foo
然后foo/.foo
在移动时会显示为foo/.foo
。
-u选项仅在源较新或目标丢失时才移动文件。 或者你可以忽略有关移动的错误.
和..
因为它们是特殊文件,无法移动,但是被shell捕获.*
glob。
所以我们有:
a |-- .foo `-- bar
和:
b
我花了很多时间找到比这里所有答案更好的解决方案。
然后我花了30秒来完成这个命令:
$ mv --help
然后我找到了我的爱:
$ mv a/ b/ -T
注意:我甚至不理解参数-T
。 它只是做了我需要的。 这里说:
-T, – no-target-directory
将DEST视为普通文件
如果要将包含隐藏文件的文件复制到您所在的当前目录中。
cp -Rp source-directory/. .