求助:批量为三级目录下的fastq.gz文件创建软链接
批量创建trio-WES样本fastq.gz软链接方案
方案1:复刻源目录结构到目标目录
如果希望目标目录和源目录的三级层级完全对应(比如源目录为/source/家系ID/样本ID/xxx.fastq.gz,目标目录同步为/target/家系ID/样本ID/xxx.fastq.gz),用以下脚本:
# 替换为你的实际源根目录和目标根目录 SOURCE_ROOT="/path/to/source" TARGET_ROOT="/path/to/target" # 遍历第三级所有fastq.gz文件,创建对应目录并软链接 find "$SOURCE_ROOT" -mindepth 3 -maxdepth 3 -type f -name "*.fastq.gz" | while read -r FILE; do # 提取源文件相对于根目录的路径 REL_PATH="${FILE#$SOURCE_ROOT/}" # 拼接目标文件路径 TARGET_FILE="$TARGET_ROOT/$REL_PATH" # 创建目标父目录(不存在则自动生成) mkdir -p "$(dirname "$TARGET_FILE")" # 创建软链接 ln -s "$FILE" "$TARGET_FILE" done
关键说明
find命令精准锁定第三级的fastq.gz文件,避免遍历更深层级while read -r FILE处理含空格的文件名,防止报错mkdir -p确保目标路径的父目录存在,不会因目录缺失中断操作- 用绝对路径创建软链接,确保无论目标目录位置如何都能访问源文件
方案2:自定义目标目录结构(按样本类型归类)
如果需要将父、母、患者样本分别归类到目标目录的不同子文件夹(如/target/父亲/、/target/母亲/、/target/先证者/),可根据文件名或二级目录特征调整脚本:
场景A:通过文件名识别样本类型
假设文件名包含_F_(父)、_M_(母)、_P_(先证者)标识:
SOURCE_ROOT="/path/to/source" TARGET_ROOT="/path/to/target" # 预创建分类目录 mkdir -p "$TARGET_ROOT/father" "$TARGET_ROOT/mother" "$TARGET_ROOT/proband" "$TARGET_ROOT/unclassified" find "$SOURCE_ROOT" -mindepth 3 -maxdepth 3 -type f -name "*.fastq.gz" | while read -r FILE; do FILENAME=$(basename "$FILE") # 根据文件名匹配分类,需根据实际命名规则修改 if [[ "$FILENAME" == *"_F_"* ]]; then ln -s "$FILE" "$TARGET_ROOT/father/$FILENAME" elif [[ "$FILENAME" == *"_M_"* ]]; then ln -s "$FILE" "$TARGET_ROOT/mother/$FILENAME" elif [[ "$FILENAME" == *"_P_"* ]]; then ln -s "$FILE" "$TARGET_ROOT/proband/$FILENAME" else ln -s "$FILE" "$TARGET_ROOT/unclassified/$FILENAME" fi done
场景B:通过二级目录识别样本类型
如果二级目录直接是样本类型(如/source/家系ID/father/xxx.fastq.gz):
SOURCE_ROOT="/path/to/source" TARGET_ROOT="/path/to/target" find "$SOURCE_ROOT" -mindepth 3 -maxdepth 3 -type f -name "*.fastq.gz" | while read -r FILE; do # 提取二级目录名称(样本类型) SAMPLE_TYPE=$(basename "$(dirname "$FILE")") # 创建分类目录 mkdir -p "$TARGET_ROOT/$SAMPLE_TYPE" # 创建软链接 ln -s "$FILE" "$TARGET_ROOT/$SAMPLE_TYPE/$(basename "$FILE")" done
预验证操作
执行脚本前,可替换mkdir -p和ln -s为echo,预览所有操作,确保路径正确:
SOURCE_ROOT="/path/to/source" TARGET_ROOT="/path/to/target" find "$SOURCE_ROOT" -mindepth 3 -maxdepth 3 -type f -name "*.fastq.gz" | while read -r FILE; do REL_PATH="${FILE#$SOURCE_ROOT/}" TARGET_FILE="$TARGET_ROOT/$REL_PATH" echo "待创建目录: $(dirname "$TARGET_FILE")" echo "待创建链接: $FILE -> $TARGET_FILE" done
内容的提问来源于stack exchange,提问作者R.L. the Researcher
相关产品推荐
相关产品推荐

