【发布时间】:2020-04-16 21:47:05
【问题描述】:
我有一个包含一长串文件扩展名的文本文件:
.sln
.csproj
.cs
.xaml
.cshtml
.javasln
.project
.java
... (etc)
我有三个项目目录,每个目录都有很多子目录。
我可以通过以下方式获取所有文件和路径的列表:find . -type f -printf "%p\n"
./DirectoryA/src/main/resources/static/resources/build/home.ini
./DirectoryA/src/main/resources/static/resources/images/spring-pivotal-logo.png
./DirectoryB/src/main/resources/db/hsqldb/data.sql
./DirectoryC/src/main/resources/project/schema.project
我想遍历这些,如果文件扩展名与我列表中的一个匹配,请将其复制到 myCopyDirectory,同时保持其目录结构。
也就是说,如果./DirectoryC/src/main/resources/project/schema.project 文件扩展名匹配.project(就像它一样)作为我的文本文件中的扩展名之一......将其复制到一个新目录,如./myCopyDirectory 为:./myCopyDirectory/DirectoryC/src/main/resources/project/schema.project。
所以我需要一个 for 或 while 循环,请原谅我糟糕的伪代码,但这是我的愿景
场景 1:动态复制文件
for FILE in `find . -type f -printf "%p\n"`; do if [ ${FILE##*.} in extensions.txt ]; then mkdir -p ./myCopyDirectory/DirectoryC/src/main/resources/project/ && cp ./DirectoryC/src/main/resources/project/schema.project ./myCopyDirectory/DirectoryC/src/main/resources/project/schema.project
场景 2:构建匹配的文件列表并复制它们
for FILE in `find . -type f -printf "%p\n"`; do if [ ${FILE##*.} in extensions.txt ]; then echo $FILE >> listOfFiles.txt
for FILE in `cat listOfFiles.txt`; do filename="${FILE##*/}" && dir="${FILE:0:${#FILE} - ${#filename}}" && if [ -e ./myCopyDirectory/$dir ]; then mkdir -p ./myCopyDirectory/$dir && cp $FILE ./myCopyDirectory
场景 3:只需将 cp -R 所有三个目录都指向 ./myCopyDirectory 并删除所有与 extensions.txt 文件中的扩展名不匹配的文件
请原谅我糟糕的伪代码。我只是想完成这项工作,而且有点超出我的深度。我可以创建一个 PERL 或 Python 脚本来执行此操作,但这似乎没有必要。
【问题讨论】:
-
修复脚本中在why-is-looping-over-finds-output-bad-practice、porkmail.org/era/unix/award.html、mywiki.wooledge.org/BashFAQ/082 和mywiki.wooledge.org/Quotes 中描述的问题,并通过shellcheck.net 运行脚本并修复它告诉您的任何额外内容,然后如果您仍有问题,请告诉我们。