如何以recursion方式将子文件夹中的所有文件(包括隐藏文件)移动到* nix中的父文件夹中?

这是一个尴尬的问题,但我不得不承认,在我职业生涯的这个晚期,我仍然对mv命令有疑问。

我经常遇到这个问题:我需要将所有文件recursion地上移一个级别。 比方说,我有文件夹foo,里面有一个文件夹栏。 酒吧有一堆文件和文件夹,包括点文件和文件夹。 我怎么把酒吧里的一切都搬到foo的水平呢?

如果foo是空的,我只需移动上面的一级,删除foo并重命名为foo。 部分问题是我无法弄清楚“包括点在内的所有东西”的mv通配符是什么。 这个问题的一部分是这样的 – 有没有深入的讨论通配符和mv命令使用的通配符(谷歌search这只会带来非常基本的教程)。

在Bash(和其他一些)中,你可以使用括号扩展来完成这一行:

mv bar/{,.}* . 

逗号分隔一个空和一个点,所以mv命令看到匹配*.*文件名

最简单的方法是用两个命令来完成,因为*不匹配

 cd /foo mv bar/* ./ mv bar/.??* ./ 

你不想在使用bar /.*的时候发现这个错误:

 rm -rf ./.* 

这是一件坏事。 任何人都想猜测为什么? 😉

首先要了解globbing – 这是由shell完成的,而不是命令。 检查你的shell的手册页的所有细节。

这个从子文件夹收集所有文件,并将它们移动到当前目录

 find . -type f -exec mv -iv \{} . \; 

如果您要使用相同的名称进行文件的写入,请使用

 yes y | find . -type f -exec mv -iv \{} . \; 

mv .??* *将处理除点之后的任何内容,后面跟单个字符。 如果这种情况对您的情况很常见,可以添加.[a-zA-Z0-9]* 。 这仍然会留下名称如.;文件.;.^.^I (tab)。 如果你需要处理所有事情,你需要更复杂一些。

 mv .. `ls -f | egrep -v '^.$|^..$' 

如果你有一个目录结构/foo/bar/并且你想要将所有文件移动到上面一个bar下方,进入bar目录并input以下命令:

 find . -depth -print0 | cpio --null -pvd ../ 

一般来说,我认为cpio(1)对于这些任务更好。 您可以通过在shell中发布info cpio来查看详细的文档。