如何检查文件夹内是否存在制表符分隔文件并通过Bash迁移
检测并迁移制表符分隔文件的Bash解决方案
嘿,你的原始CMD命令问题出在——它只是检查目标文件夹里有没有任意文件,完全没筛选你要的制表符分隔文件!而且你明确说要用Bash来迁移,那我给你一套完整的Bash脚本方案,完美覆盖你的两个需求:
先明确需求场景
首先得说清楚,“制表符分隔文件”通常有两种定义,你可以按需选择:
- 场景A:按后缀筛选:找
.tsv后缀的文件(这是制表符分隔文件的标准后缀) - 场景B:按内容筛选:不管后缀,只要文件内容里有制表符(
\t)就算
场景A:迁移.tsv后缀文件
直接用后缀匹配最简单,脚本如下:
# 替换成你的源文件夹和目标文件夹路径 SOURCE_DIR="./folderName" TARGET_DIR="./your_target_folder" # 先检查源文件夹是否存在 if [ ! -d "$SOURCE_DIR" ]; then echo "Error: 源文件夹 $SOURCE_DIR 不存在!" exit 1 fi # 确保目标文件夹存在(不存在就自动创建) mkdir -p "$TARGET_DIR" # 匹配所有.tsv文件 TSV_FILES=("$SOURCE_DIR"/*.tsv) # 判断是否找到有效文件(避免空匹配的情况) if [ -f "${TSV_FILES[0]}" ]; then echo "找到 $((${#TSV_FILES[@]})) 个.tsv文件,开始迁移..." # 移动文件到目标文件夹 mv "${TSV_FILES[@]}" "$TARGET_DIR/" echo "搞定!所有.tsv文件已经移到 $TARGET_DIR 了" else echo "没找到任何.tsv文件哦~" fi
场景B:迁移内容含制表符的文件
如果需要根据文件内容判断(比如有些文件没.tsv后缀但确实是制表符分隔的),用grep来检测:
SOURCE_DIR="./folderName" TARGET_DIR="./your_target_folder" if [ ! -d "$SOURCE_DIR" ]; then echo "Error: 源文件夹 $SOURCE_DIR 不存在!" exit 1 fi mkdir -p "$TARGET_DIR" # 查找所有内容含制表符的文件(处理带空格的文件名) MATCHING_FILES=() while IFS= read -r -d $'\0' file; do MATCHING_FILES+=("$file") done < <(grep -rlZ $'\t' "$SOURCE_DIR" --include="*") if [ ${#MATCHING_FILES[@]} -gt 0 ]; then echo "找到 ${#MATCHING_FILES[@]} 个含制表符的文件,开始迁移..." mv "${MATCHING_FILES[@]}" "$TARGET_DIR/" echo "迁移完成!所有符合条件的文件都移走啦" else echo "没找到任何含制表符的文件~" fi
脚本小说明
mkdir -p "$TARGET_DIR":不管目标文件夹存不存在,都能确保它可用,省得手动创建- 场景A里的
[ -f "${TSV_FILES[0]}" ]是为了避免“没有匹配文件时,数组里会留一个./folderName/*.tsv的无效值”的问题 - 场景B里的
-Z和read -d $'\0'是用来处理文件名带空格的情况,避免脚本出错 - 如果想复制而不是移动文件,把
mv换成cp就行
顺便说下你原始CMD命令的问题
你的命令>nul 2>nul dir /a-d "folderName\*" && (echo Files exist) || (echo No file found)有两个问题:
- 它只是检查文件夹里有没有任意文件,根本没筛选制表符分隔的文件
- 如果文件夹本身不存在,它也会输出“No file found”,没法区分“文件夹不存在”和“文件夹里没文件”
要是你还是想用CMD版本的检测+迁移,可以试试这个:
@echo off set "SOURCE_DIR=folderName" set "TARGET_DIR=your_target_folder" :: 先检查源文件夹是否存在 if not exist "%SOURCE_DIR%" ( echo 错误:源文件夹 %SOURCE_DIR% 不存在! exit /b 1 ) :: 检查有没有.tsv文件 dir /a-d "%SOURCE_DIR%\*.tsv" >nul 2>nul if %errorlevel% equ 0 ( echo 找到.tsv文件,开始迁移... move "%SOURCE_DIR%\*.tsv" "%TARGET_DIR%\" echo 迁移完成! ) else ( echo 未找到任何.tsv文件! )
内容的提问来源于stack exchange,提问作者whatthefish
相关产品推荐
相关产品推荐

