如何将嵌套子文件夹转换为单个子文件夹

如何将嵌套子文件夹转换为单个子文件夹

将指定目录的子文件夹“折叠”为名为“加入子文件夹”的单个文件夹的好方法是什么?

因此给定这个目录结构...

./zero.csv
./reports/r1/a/b/c/one.csv
./reports/r2/a/two.csv
./reports/r3/x/y/z/three.csv
./reports/r4/x/y/four.csv

我如何指定./reports应该折叠的子文件夹 - 导致:

./zero.csv
./reports/r1.a.b.c/one.csv
./reports/r2.a/two.csv
./reports/r3.x.y.z/three.csv
./reports/r4.x.y/four.csv

谢谢

答案1

prename使用aka进行批量重命名perl-rename

shopt -s globstar
prename -n 's{ (reports)/(.+)/ }{ "$1/" . $2=~s{/}{.}gr . "/" }xe' reports/**/*.csv

(当输出看起来正确时更改-n为。)-v

清理剩余的空目录:

find reports -depth -type d -exec rmdir -v --ignore-fail-on-non-empty {} \;

prename 将 Perl 表达式(通常s/regex/replacement/但不限于)应用于每个指定路径。这里它使用s{regex}{replacement}来避免与斜线相关的麻烦,将路径与 进行匹配(reports)/(.+)/。使用x标志,替换本身是另一个 Perl 表达式,它保留第一组(reports),但将第二组中的斜线替换为句点(.+)

相关内容