【发布时间】:2019-01-03 23:18:47
【问题描述】:
我必须从不同的文件夹复制许多文件。
- 不知道源文件夹中有多少个
- 知道文件夹与包含的文件同名
- 只需要复制包含某些文件扩展名的文件夹
源文件夹结构示例
源文件夹结构如下
root
- folder1
- folder1.txt
- folder2
- folder2.csv
- folder3
- folder3.txt
目标文件夹结构示例
目标文件夹应该是这样的结构
root
- folder1
- folder1.txt
- folder3
- folder3.txt
为了完成通用复制和重新创建文件夹结构,我使用了以下脚本:
cp src/**/*.txt dest/
for file in $(ls *.txt);
do mkdir -p source/${file%.*}/ && mv $file dest/${file%.*}/;
done
首先我复制目标文件夹中的所有文件。基于每个文件都在同名文件夹中的假设,然后我正在移动文件以重新创建原始结构。这个脚本有效地工作得很好。
现在要求已更改为支持多级文件夹结构。例如
root
- folder1
- folder11
- folder11.txt
- folder2
- folder2.csv
- folder3
- folder3.txt
如何调整脚本以保持通用性?
【问题讨论】:
-
您可以将源文件夹封装到一个数组中,并在该数组的循环中调整您的脚本。
-
有什么理由不使用
rsync?这似乎对我有用(模仿你的结构,而不是复制空的结构)。rsync -av --include='*.*' --prune-empty-dirs lorenzo/src/ lorenzo/dst -
顺便说一句,mickp 的回答很好地遵循了相关的最佳实践——考虑对其进行模式化,尤其是使用 shell globbing 而不是ParsingLs,并注意引用所有扩展. (如果您通过shellcheck.net 运行您的原始代码,请考虑阅读从它抛出的警告链接的wiki 页面,特别是SC2045 和SC2086)。