Linux 终端 - 复制包含 JS 或 TS 文件的所有目录,设置要复制的每个项目的最大深度

Linux 终端 - 复制包含 JS 或 TS 文件的所有目录,设置要复制的每个项目的最大深度

我有数百个目录,每个目录中都有一个或多个 .js 或 .ts 文件,但也包含其他文件。其中许多文件嵌套多层。我试图将每个子目录复制到一个包含目录内容的新目录中,但只包含 .js 或 .ts 文件。

以下是我目前所掌握的信息:

find "." -path "*node_modules*" -prune -o -type f \( -iname \*.ts -o -iname \*.js \) -printf "%h\0" | sort -uz | xargs -0 -I _ cp -a _ "/c/test/"

当前所做的是复制文件类型为 .ts 或 .js 的所有目录(node_modules 目录除外),并将它们复制到该/c/test/目录。但是,我遇到的问题是,对于每个目录,它会复制所有文件和所有子目录,而我只希望它复制位于该目录中的 .ts 或 .js 文件。这里是最重要的部分,对于它复制的每个目录,无论该目录有多深或多浅,我只希望它复制该目录。我不想复制其中包含所有子目录的目录。但是,我想复制每个子目录,无论它嵌套得多深。希望这是有意义的。

想象一下我的目录结构是你的梳妆台。每个抽屉里都有几个其他抽屉。有些抽屉里有物品,但也有一些其他抽屉。你可以简单地将所有物品清空到地板上,但这不是我想要做的。我想清空地板上的所有抽屉,保留里面的物品,但任何抽屉都不应包含另一个抽屉。但最终结果是每个有物品的抽屉都在地板上。

换句话说,最终结果应该是 /test 目录,里面有一堆复制的目录,但每个目录里面都没有子目录。它们里面应该只有 js 或 ts 文件。我希望这是合理的。

答案1

感谢 Kamil Maciorowski 留下评论,链接了与我需要做的事情类似的内容。我能够调整他的解决方案并得出一个可接受的解决方案,该解决方案与我最初要求的略有不同,该解决方案是将所有文件保存在一个目录中,但将父目录和祖父目录添加到文件名的前面。

destinationfolder="/c/MyScriptFiles/" \
find . -path "*node_modules*" -prune -o -type f \( -name '*.js' -or -name '*.ts' -or -name '*.json' \) \
   -exec sh -c '
      for f do
         grandparentDirectory="$(basename "$(dirname "$(dirname "$f")")")"
         parentDirectory="$(basename "$(dirname "$f")")"
         fileName="$(basename "$f")"
         cp ${f} ${destinationfolder}${grandparentDirectory}.${parentDirectory}.${fileName}
         printf "%s\n\n" "Saving ${f} to ${destinationfolder}${grandparentDirectory}.${parentDirectory}.${fileName}"
      done
   ' sh-find {} +

相关内容