这一定是一个热门问题,但我找不到答案。
如何通过 * 将所有文件(包括隐藏文件)移动到父目录,如下所示:
mv /path/subfolder/* /path/
这会将所有文件按预期移动到父目录,但不会移动隐藏文件。如何做到这一点?
您可以在 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 复制以包括隐藏文件和隐藏目录及其内容?)
我认为这是最优雅的,因为它也不会试图移动
..
:
mv /source/path/{.[!.],}* /destination/path
这会将所有文件按预期移动到父目录,但会 不移动隐藏文件。如何做到这一点?
您可以打开
dotglob
:
shopt -s dotglob # This would cause mv below to match hidden files
mv /path/subfolder/* /path/
要关闭
dotglob
,您需要说:
shopt -u dotglob
通过将
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
命令结合使用可以消除所有这些问题。
更简单的替代解决方案是使用
rsync
实用程序:
sudo rsync -vuar --delete-after --dry-run path/subfolder/ path/
注意:以上命令将显示要更改的内容。 要执行实际更改,请删除
--dry-run
。
优点是原始文件夹(
subfolder
)以及命令的一部分将被删除,并且当使用此处的mv
示例时,您仍然需要清理文件夹,更不用说额外的头痛来覆盖隐藏和一种模式中的非隐藏文件。
此外
rsync
提供了在遥控器之间复制/移动文件的支持,这将确保文件完全按照原来的样子复制(-a
)。
使用的
-u
参数将跳过现有的较新文件,-r
递归到目录,-v
会增加详细程度。
让我向您介绍我的朋友“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
完成后最好将其重新打开,否则您会混淆假设它将关闭的事情。
当我必须将所有文件(包括
.
文件)复制到目标目录保留权限时,我对此问题的解决方案是:(如果已存在则覆盖)
yes | cp -rvp /source/directory /destination/directory/
yes
用于自动覆盖目标文件,
r
递归,
v
冗长,
p
保留权限。
请注意,源路径不以
/
结尾(因此所有文件/目录和.文件都会被复制)
目标目录以
/
结尾,因为我们将源文件夹的内容作为一个整体放置到目标中。
就做吧
for I in $(ls -A dir)
do
mv dir/$I newDir
done
假设您位于子文件夹 奔跑
find . -maxdepth 1 -exec mv {} .. \;
想象一下,到 2024 年,这仍然受到追捧。BASH 中的另一种选择是使用复制,然后根据需要删除源目标。无需正则表达式或修改 bash 脚本选项。这是代码:
cp -arfv source/. desination #Note use of /.
rm -rfv source/*
注意以下事项:
/.
而不是 /*
来复制所有文件夹/文件、子文件夹/文件和隐藏文件夹/文件-arfv
表示存档、递归、强制和详细我的两分钱。