如何将包括隐藏文件在内的所有文件通过*

它一定是一个受欢迎的问题,但我找不到答案。

如何将所有文件通过*包括隐藏文件,以及像这样的父目录:

mv /path/subfolder/* /path/ 

这将像预期的那样将所有文件移动到父目录,但不会移动隐藏的文件。 怎么做?

您可以在UNIX和Linux的答案中find有关此方面的一整套解决scheme。 如何将所有文件(包括隐藏文件)从一个目录移动到另一个目录? 。 它显示了Bash,zsh,ksh93,standard(POSIX)sh等的解决scheme。


你可以一起使用这两个命令:

 mv /path/subfolder/* /path/ # your current approach mv /path/subfolder/.* /path/ # this one for hidden files 

或所有在一起( 感谢pfnuesel ):

 mv /path/subfolder/{.,}* /path/ 

其中扩展到:

 mv /path/subfolder/* /path/subfolder/.* /path/ 

(例如: echo a{.,}b展开为ab ab

注意这将显示几个警告:

 mv: cannot move '/path/subfolder/.' to /path/.': Device or resource busy mv: cannot remove /path/subfolder/..': Is a directory 

只要忽略它们:发生这种情况是因为/path/subfolder/{.,}*也扩展到/path/subfolder/./path/subfolder/.. ,这是目录和父目录(请参阅“。”和“..”是什么意思,当在一个文件夹? )。


如果你想复制,你可以使用一个单纯的:

 cp -r /path/subfolder/. /path/ # ^ # note the dot! 

这将复制所有文件,包括普通文件和隐藏文件,因为/path/subfolder/. 扩展为“从这个目录中的一切”(来源: 如何复制与cp包括隐藏的文件和隐藏的目录及其内容? )

这将像预期的那样将所有文件移动到父目录,但不会移动隐藏的文件。 怎么做?

你可以打开dotglob

 shopt -s dotglob # This would cause mv below to match hidden files mv /path/subfolder/* /path/ 

为了closuresdotglob ,你需要说:

 shopt -u dotglob 

我认为这是最优雅的,因为它也不会移动..

 mv /source/path/{.[!.],}* /destination/path 

让我把你介绍给我的朋友“dotglob”。 打开或closures“*”是否包含隐藏文件。

 $ mkdir test $ cd test $ touch abc .hidden .hi .den $ ls -a . .. .den .hi .hidden abc $ shopt -u dotglob $ ls * abc $ for i in * ; do echo I found: $i ; done I found: a I found: b I found: c $ shopt -s dotglob $ ls * .den .hi .hidden abc $ for i in * ; do echo I found: $i ; done I found: .den I found: .hi I found: .hidden I found: a I found: b I found: c 

它默认为“关”。

 $ shopt dotglob dotglob off 

当你完成后最好把它重新打开,否则你会混淆假定它将被closures的事物。

另一个更简单的解决scheme是使用rsync工具:

 rsync -vuar --delete-after path/subfolder/ path/ 

优点是原始文件夹( subfolder )将被删除以及命令的一部分,当在这里使用mv例子,你仍然需要清理文件夹,更不用说额外的头痛来掩盖隐藏和非隐藏的文件一个单一的模式。

此外rsync提供了在远程之间复制/移动文件的支持,它将确保文件完全按原来的格式复制( -a )。

使用的-u参数会跳过现有的新文件, -rrecursion到目录中, -v会增加冗长。

通过将find命令与mv命令结合使用,可以防止mv命令尝试移动目录(例如... )和子目录。 这里有一个选项:

 find /path/subfolder -maxdepth 1 -type f -name '*' -exec mv -n {} /path \; 

有一些其他答案提供的问题。 例如,以下每一项都将尝试从源path移动子目录:

 1) mv /path/subfolder/* /path/ ; mv /path/subfolder/.* /path/ 2) mv /path/subfolder/{.,}* /path/ 3) mv /source/path/{.[!.],}* /destination/path 

另外,2)包括。 和..文件和3)错过像.foobar,… barfoo等文件

你可以使用mv /source/path/{.[!.],..?,}* /destination/path ,其中包括3)所遗漏的文件,但是它仍然会尝试移动子目录。 如上所述,使用find命令和mv命令可以消除所有这些问题。