仅复制具有子文件夹结构的 *.h 文件 bash

仅复制具有子文件夹结构的 *.h 文件 bash

我需要编写一个脚本来仅复制 *.h 文件并保存文件夹结构:

现在看起来像这样:

cd "${SRCROOT}"
echo 'Copying Cocos Headers into Framework..'
cd ..
for H in `find ./Frameworks/Cocos -name "*.h"`;  do
echo "${H}"  
ditto -V "${H}" "${BUILD_DIR}/include/header/cocos/"

done

但文件位于一个文件夹中,我该如何解决这个问题?

答案1

在linux下find可真是功能强大。

您可以使用

OutDir="${BUILD_DIR}/include/header/cocos/" # Linux is case sensitive, Check if
mkdir -p "${OutDir}"                        # it is needed Cocos or cocos...
cd ./Frameworks/Cocos                       # just to have clean path to create

# Here with only one line 
find . -name "*.h" -exec bash -c 'cp -p --parents {} "${OutDir}" ' \;
# cd - # Eventually to come back to the previous path 

注意:
cp -p保留所有权...
cp --parents创建目标目录,但需要其基目录存在。如果find 的所有选项
mkdir -p都存在,则创建包含所有父级路径的目录而不会出现错误。
man find


如果你想保持接近先前的脚本

cd "${SRCROOT}"
echo 'Copying Cocos Headers into Framework..'
StartSearchDir="${SRCROOT}../Frameworks/Cocos"
BaseDestDir="${BUILD_DIR}/include/header/cocos/"
cd $StartSearchDir
for H in `find . -name "*.h"`;  do
  echo "${H}" 
  PathFileDir=$(dirname $H)
  mkdir -p "${BUILD_DIR}/${PathFileDir}"     # no error, make parents too
  cp -p "$H" "${BUILD_DIR}/${PathFileDir}/"    # preserve ownership...
  # ditto -V "${H}" "${BUILD_DIR}/include/header/cocos/" # commented line
done

注意,您dirname可以从完整路径+文件名字符串中提取路径。
查看帮助man dirnameman basename

答案2

以这种方式解决了该问题:

cd "${SRCROOT}"
echo 'Copying Cocos Headers into Framework..'

StartSearchDir="${SRCROOT}/../Frameworks/Cocos"
BaseDestDir="${BUILD_DIR}/include/${PRODUCT_NAME}/header/cocos/"

echo 'STARTDIR:'$StartSearchDir
echo 'DESTDIR:'$BaseDestDir

cd $StartSearchDir

tar -cf - . | (cd $BaseDestDir ; tar -xpf - --include='*.h')

但哈斯塔的解决方案也很好——让他的解决方案成为最好的解决方案

相关内容