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