Unix shell file copy flattening folder structure在UNIX bash shell(特别是Mac OS X Leopard)上,将具有扩展名的每个文件从文件夹层次结构(包括子目录)复制到同一目标文件夹(不包含子文件夹)的最简单方法是什么? 显然,存在源层次结构中存在重复项的问题。 我不介意它们是否被覆盖。 示例:我需要复制以下层次结构中的每个.txt文件
到名为" dest"的文件夹并获取:
在bash中:
Magnus解决方案的唯一问题是,它为每个文件启动了一个新的" cp"进程,这并不是非常有效,特别是在存在大量文件的情况下。 在Linux(或其他具有GNU coreutils的系统)上,您可以执行以下操作:
(-0允许它在文件名中包含怪异字符(例如空格)时起作用。) 不幸的是,我认为Mac具有BSD风格的工具。有人知道等效于" -t"开关的"标准"吗? 上面的答案不允许名称冲突,因为询问者不介意文件被覆盖。 我确实认为文件会被覆盖,所以提出了另一种方法。用-替换路径中的每个/-在名称中保留层次结构,并将所有文件放在一个平面文件夹中。 我们使用find获取所有文件的列表,然后使用awk创建具有原始文件名和修改后的文件名的mv命令,然后将其传递给bash以执行。
其中./from和./to是mv from和to的目录。 如果您真的只想运行一个命令,为什么不运行一个命令并运行它呢?像这样:
但这并不会影响性能,除非您经常执行此操作或拥有大量文件。但是,请注意避免名称冲突。我在测试中注意到,GNU cp至少会警告冲突:
我认为最干净的是:
与-exec选项相比,需要记住的语法更少。 就FreeBSD上cp的手册页而言,不需要-t开关。如果传递了两个以上的名称,cp将假定命令行上的最后一个参数为目标目录。 |