我有数百个目录,每个目录中都有一个或多个 .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 {} +