将指定目录的子文件夹“折叠”为名为“加入子文件夹”的单个文件夹的好方法是什么?
因此给定这个目录结构...
./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)
,但将第二组中的斜线替换为句点(.+)
。