如何将包括隐藏文件在内的所有文件通过*
它一定是一个受欢迎的问题,但我找不到答案。
如何将所有文件通过*包括隐藏文件,以及像这样的父目录:
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命令可以消除所有这些问题。