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

问题描述 投票:0回答:10

这一定是一个热门问题,但我找不到答案。

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

mv /path/subfolder/* /path/

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

linux bash shell command
10个回答
238
投票

您可以在 UNIX & Linux 对 How do you move all files (包括隐藏文件)从一个目录到另一个目录?的回答中找到一套全面的解决方案。它显示了 Bash、zsh、ksh93、标准 (POSIX) sh 等中的解决方案。


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

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
扩展为
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 复制以包括隐藏文件和隐藏目录及其内容?


32
投票

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

..

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

30
投票

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

您可以打开

dotglob
:

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

要关闭

dotglob
,您需要说:

shopt -u dotglob

6
投票

通过将

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
命令结合使用可以消除所有这些问题。


6
投票

更简单的替代解决方案是使用

rsync
实用程序:

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

注意:以上命令将显示要更改的内容。 要执行实际更改,请删除

--dry-run

优点是原始文件夹(

subfolder
)以及命令的一部分将被删除,并且当使用此处的
mv
示例时,您仍然需要清理文件夹,更不用说额外的头痛来覆盖隐藏和一种模式中的非隐藏文件。

此外

rsync
提供了在遥控器之间复制/移动文件的支持,这将确保文件完全按照原来的样子复制(
-a
)。

使用的

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


3
投票

让我向您介绍我的朋友“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

完成后最好将其重新打开,否则您会混淆假设它将关闭的事情。


2
投票

当我必须将所有文件(包括

.
文件)复制到目标目录保留权限时,我对此问题的解决方案是:(如果已存在则覆盖)

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

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

请注意,源路径不以

/
结尾(因此所有文件/目录和.文件都会被复制)

目标目录以

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


0
投票

就做吧

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

0
投票

假设您位于子文件夹 奔跑

find . -maxdepth 1 -exec mv {} .. \;


0
投票

想象一下,到 2024 年,这仍然受到追捧。BASH 中的另一种选择是使用复制,然后根据需要删除源目标。无需正则表达式或修改 bash 脚本选项。这是代码:

cp -arfv source/. desination #Note use of /.
rm -rfv source/*

注意以下事项:

  1. 我们使用
    /.
    而不是
    /*
    来复制所有文件夹/文件、子文件夹/文件和隐藏文件夹/文件
  2. -arfv
    表示存档、递归、强制和详细
  3. 复制后删除文件夹

我的两分钱。

© www.soinside.com 2019 - 2024. All rights reserved.