如何移动所有文件,包括隐藏文件到父目录通过 *

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

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

mv /path/subfolder/* /path/

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

116326 次浏览

在 UNIX & Linux 对 如何将所有文件(包括隐藏文件)从一个目录移动到另一个目录?的回答中,您可以找到一套全面的解决方案。它用 Bash、 zsh、 ksh93、标准(POSIX) sh 等显示解决方案。


您可以同时使用以下两个命令:

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

或全部(谢谢 Pfnusel) :

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/..,它们是目录和父目录(参见 “ .”和“ . .”在文件夹里是什么意思?)。


如果你只想复制,你可以使用纯粹的:

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/

为了关闭 dotglob,你需要说:

shopt -u 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

当你完成后最好把它重新打开,否则你会混淆那些假设它会关闭的东西。

我认为这是最优雅的,因为它也没有试图移动 ..:

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

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

sudo rsync -vuar --delete-after --dry-run path/subfolder/ path/

注意: 以上命令将显示将要更改的内容。

这样做的好处是原始文件夹(subfolder)和命令的一部分都会被删除,在这里使用 mv示例时,你仍然需要清理你的文件夹,更不用说以一种单一模式覆盖隐藏和非隐藏文件的额外麻烦。

此外,rsync还支持在远程之间复制/移动文件,并确保复制的文件与原来完全一样(-a)。

使用的 -u参数将跳过现有的较新文件,-r递归到目录中,而 -v将增加冗长度。

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

find /path/subfolder -maxdepth 1 -type f -name '*' -exec mv -n {} /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命令可以消除所有这些问题。

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

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

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

注意,源路径不以 /结束(所以所有的文件/目录和. files 都被复制)

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

照做就是了

for I in $(ls -A dir)
do
mv dir/$I newDir
done

假设您在 < strong > 子文件夹中 运行 find . -maxdepth 1 -exec mv {} .. \;