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


14

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

我经常遇到这个问题:我需要将所有文件递归上移一个级别。假设我有foo文件夹,并且其中有一个文件夹栏。Bar杂乱的文件和文件夹,包括点文件和文件夹。如何将bar中的所有内容移到foo级别?

如果foo为空,我只需将bar上移一层,删除foo并将bar重命名为foo。问题的部分原因是我无法弄清楚MV的“所有包含点”的通配符是什么。这个问题的一部分是-是否深入讨论了cp和mv命令在某处使用的通配符(搜索这只会带来非常基础的教程)。

Answers:


19

在Bash(和其他一些)中,您可以使用大括号扩展来一行完成此操作:

mv bar/{,.}* .

逗号分隔一个空值和一个点,因此该mv命令将看到*.*


这也尝试移动“ ..”,但失败,并显示消息“资源正忙”。仍然可以。
Xananax 2012年

3
匿名用户建议:To eliminate the error caused by also matching "." and "..", use this command: mv bar/{,.[!.],..?}* .
HopelessN00b 2012年

2

最简单的方法是在两个命令中执行此操作,因为*不匹配.whatever

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

您不想使用在犯此错误时发现的bar /.*:

rm -rf ./.* 

这是一件坏事。任何人都想猜为什么?;-)


我认为Bash或Zsh不会扩展.*...。Zsh至少不适合我。
Mikael S

Mikael:我可以保证bash可以(或至少可以做到),因为我必须恢复通过这样做而消灭的用户目录
Matt Simmons 2010年

2

关于全局的第一件事-由外壳而不是命令完成。检查您的Shell手册页以获取所有详细信息。


2

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

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

如果您想使用相同的名称来写文件,请使用

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

1

mv .??* *会处理除点号后跟单个字符以外的所有内容。如果您的情况很常见,则可以添加.[a-zA-Z0-9]*。这还会留下的文件,其名称.;.^.^I(标签)。如果您需要处理所有事情,则需要更加复杂一些。

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

0

如果您具有目录结构,/foo/bar/并且想将所有文件移至上bar一步,请进入bar目录并键入以下内容:

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

总的来说,我认为cpio(1)这些任务更好。您可以通过info cpio在shell中发出来签出详细的文档。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.