如何通过*将包含隐藏文件的所有文件移动到父目录中

时间:2013-11-25 11:34:55

标签: linux bash shell command

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

如何通过*将所有文件移动到包括隐藏文件以及父目录,如下所示:

mv /path/subfolder/* /path/

这会将所有文件移动到父目录,但不会移动隐藏文件。怎么做?

7 个答案:

答案 0 :(得分:172)

您可以在UNIX和UNIX中找到一套全面的解决方案。 Linux对How do you move all files (including hidden) from one directory to another?的回答。它显示了Bash,zsh,ksh93,standard(POSIX)sh等的解决方案。


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

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

或全部(thanks pfnuesel):

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

扩展为:

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

(示例:echo a{.,}b扩展为a.b 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/..,它们是目录和父目录(请参阅What do “.” and “..” mean when in a folder?)。


如果您只想复制,可以使用仅仅:

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

这将复制所有正常和隐藏文件,因为/path/subfolder/.扩展为“此目录中的所有内容”(来源:How to copy with cp to include hidden files and hidden directories and their contents?

答案 1 :(得分:28)

  

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

您可以启用dotglob

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

要关闭dotglob,您需要说:

shopt -u dotglob

答案 2 :(得分:25)

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

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

答案 3 :(得分:4)

另一种更简单的解决方案是使用rsync实用程序:

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

优点是原始文件夹(subfolder)将被删除以及命令的一部分,在此处使用mv示例时,您仍需要清理文件夹,更不用说在单一模式中覆盖隐藏和非隐藏文件的额外麻烦。

此外,rsync支持在远程处理器之间复制/移动文件,并确保文件的复制完全符合原始文件(-a)。

使用过的-u参数会跳过现有的较新文件,-r会递归到目录中,-v会增加详细程度。

答案 4 :(得分:2)

让我向你介绍我的朋友“dotglob”。无论“*”是否包含隐藏文件,它都会打开和关闭。

$ mkdir test
$ cd test
$ touch a b c .hidden .hi .den
$ ls -a
. ..  .den  .hi .hidden a b c

$ shopt -u dotglob
$ ls *
a b c
$ 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 a b c
$ 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

最好在完成后再打开它,否则你会混淆那些假设它会被关闭的东西。

答案 5 :(得分:2)

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

.

提供的其他一些答案存在问题。例如,以下各项将尝试从源路径移动子目录:

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

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

您可以使用1) mv /path/subfolder/* /path/ ; mv /path/subfolder/.* /path/ 2) mv /path/subfolder/{.,}* /path/ 3) mv /source/path/{.[!.],}* /destination/path ,其中包含3个错过的文件,但它仍会尝试移动子目录。如上所述,使用mv /source/path/{.[!.],..?,}* /destination/path命令和find命令可以消除所有这些问题。

答案 6 :(得分:1)

当我必须将所有文件(包括.个文件)复制到目标目录保留权限时,我解决此问题的方法是:(覆盖如果已经存在)

yes | cp -rvp /source/directory /destination/directory/

yes用于自动覆盖目标文件, r递归, v详细, p保留权限。

请注意,源路径不是以/ 结尾(因此会复制所有files /目录和。文件)

目标目录以/ 结尾,因为我们将源文件夹的内容作为整体放置到目标。