#!/usr/bin/env bash # 1. 第一步:先死等一个文件名输入(read 在任何环境下都不会自动退出) echo "———————————————————————————————————————————————————" echo -e "\033[1;32m[启动搜索]\033[0m" read -p "搜索文件名或输入新路径 >>> " SEARCH_NAME # 如果用户直接回车,给个默认名,防止后续逻辑空跑 [[ -z "$SEARCH_NAME" ]] && SEARCH_NAME="new_file_$(date +%s).sh" # 2. 尝试搜索,但不强制要求搜索结果 # 用 || true 保证即使 fd 没搜到东西,脚本也继续执行 SEARCH_RESULTS=$(fd -t f "$SEARCH_NAME" 2>/dev/null || echo "") if [[ -n "$SEARCH_RESULTS" ]]; then # 如果有搜索结果,才调用 fzf 让用户选 # 强制加入一个“使用我刚输入的路径”选项 CHOICES=$(echo -e "[直接使用输入路径: $SEARCH_NAME]\n$SEARCH_RESULTS") SELECTED=$(echo "$CHOICES" | fzf \ --prompt="发现匹配项,请选择 > " \ --header="[Ctrl-Y] 预览 | [Enter] 确认" \ --preview='[[ -f {} ]] && cat {} || echo "新路径待创建"' \ --preview-window="hidden:right:60%:wrap" \ --bind="ctrl-y:toggle-preview") # 如果用户在 fzf 里按了 ESC 或者选了第一个 if [[ -z "$SELECTED" ]] || [[ "$SELECTED" == "[直接使用输入路径: $SEARCH_NAME]" ]]; then SELECTED="$SEARCH_NAME" fi else # 如果 fd 没搜到任何东西,跳过 fzf,直接使用 SEARCH_NAME SELECTED="$SEARCH_NAME" fi # 3. 状态显示 (完全匹配你要求的视觉风格) if [[ -s "$SELECTED" ]]; then STATUS="已有内容" elif [[ -f "$SELECTED" ]]; then STATUS="空" else STATUS="待创建 (新路径)" fi clear echo -e "\033[1;32m[路径]\033[0m $SELECTED" echo -e "\033[1;34m[状态]\033[0m $STATUS" echo "———————————————————————————————————————————————————" echo -e "\033[1;32m[输入内容]\033[0m" echo " [结束]Eo / EOFover " # 4. 多行输入阶段 (稳如老狗的批量粘贴模式) TMP_BUFFER=$(mktemp) while IFS= read -r line; do # 匹配你要求的结束符 if [[ "$line" == "EOFover" ]] || [[ "$line" == "Eo" ]]; then break fi echo "$line" >> "$TMP_BUFFER" done # 5. 执行最终写入 echo "———————————————————————————————————————————————————" # 自动创建不存在的目录 DIR_NAME=$(dirname "$SELECTED") [[ "$DIR_NAME" != "." ]] && mkdir -p "$DIR_NAME" 2>/dev/null cat "$TMP_BUFFER" > "$SELECTED" rm "$TMP_BUFFER" echo "———————————————————————————————————————————————————" echo -e "\n\033[1;32m 写入成功 \033[0m" echo "———————————————————————————————————————————————————"