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

Tro*_*ike 103 linux bash shell command

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

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

mv /path/subfolder/* /path/
Run Code Online (Sandbox Code Playgroud)

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

fed*_*qui 189

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


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

mv /path/subfolder/* /path/   # your current approach
mv /path/subfolder/.* /path/  # this one for hidden files
Run Code Online (Sandbox Code Playgroud)

或者全部在一起(感谢pfnuesel):

mv /path/subfolder/{.,}* /path/
Run Code Online (Sandbox Code Playgroud)

其中扩展为:

mv /path/subfolder/* /path/subfolder/.* /path/
Run Code Online (Sandbox Code Playgroud)

(例如: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
Run Code Online (Sandbox Code Playgroud)

只是忽略它们:发生这种情况是因为/path/subfolder/{.,}*还扩展为/path/subfolder/./path/subfolder/..目录和父目录(请参阅"."和".."在文件夹中的含义?).


如果您只想复制,可以使用以下内容:

cp -r /path/subfolder/. /path/
#                     ^
#                     note the dot!
Run Code Online (Sandbox Code Playgroud)

这将复制所有正常和隐藏文件,因为/path/subfolder/.扩展为"来自此目录的所有内容"(来源:如何使用cp复制以包含隐藏文件和隐藏目录及其内容?)

  • 合并两个命令:`mv /path/subfolder/{.,}}/path /` (17认同)
  • 我收到以下错误:``mv:overwrite`/path /.'?y mv:无法移动`/ path/subfolder /.' 到`/ path /.':设备或资源忙mv:覆盖`/ path/..'?y mv:无法将`/ path/subfolder/..'移动到`/ path/..':设备或资源繁忙`` (7认同)
  • "只是忽略警告"可能并不总是一个好主意.现在我遇到了一个脚本问题,如果任何步骤失败我需要停止执行 - 因为这个解决方案总是会导致错误,它会杀死我的脚本.我需要一种方法来确定mv命令是否失败...... (6认同)
  • 大括号只是`mv/path/subfolder/*/path/subfolder/.*/path /`的捷径,并不是将两个命令合二为一的严格要求. (2认同)

dev*_*ull 28

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

你可以打开dotglob:

shopt -s dotglob               # This would cause mv below to match hidden files
mv /path/subfolder/* /path/
Run Code Online (Sandbox Code Playgroud)

为了关闭dotglob,你需要说:

shopt -u dotglob
Run Code Online (Sandbox Code Playgroud)

  • 这也会影响所有其他命令,如`ls` ..因此可能不是你想要的 (2认同)

Van*_*aij 27

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

mv /source/path/{.[!.],}* /destination/path
Run Code Online (Sandbox Code Playgroud)


ken*_*orb 6

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

sudo rsync -vuar --delete-after --dry-run path/subfolder/ path/
Run Code Online (Sandbox Code Playgroud)

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

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

此外,rsync还提供了在远程设备之间复制/移动文件的支持,并且可以确保文件完全按照原来的样子进行复制 ( -a)。

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


tea*_*144 6

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

find /path/subfolder -maxdepth 1 -type f -name '*' -exec mv -n {} /path \;
Run Code Online (Sandbox Code Playgroud)

提供的其他一些答案存在问题。例如,以下每个命令都会尝试从源路径移动子目录:

1) mv /path/subfolder/* /path/ ; mv /path/subfolder/.* /path/
2) mv /path/subfolder/{.,}* /path/ 
3) mv /source/path/{.[!.],}* /destination/path
Run Code Online (Sandbox Code Playgroud)

此外,2) 包括 . 和 .. 文件以及 3) 丢失诸如 ..foobar、...barfoo 等文件。

您可以使用 ,mv /source/path/{.[!.],..?,}* /destination/path它将包含 3) 中遗漏的文件,但它仍会尝试移动子目录。将find命令与mv我上面描述的命令一起使用可以消除所有这些问题。