bash: 处理奇怪的文件名尾无效选项--1

bash: dealing with strange filenames tail invalid option --1

我希望我的脚本找到第一行等于 START 的文件(在当前目录中)。然后该文件应该有 FILE <file_name> 作为最后一行。所以我想提取 <file_name> - 我为此使用 tail 。它适用于标准文件名,但适用于非标准文件名,如 a aa+b-c\ = etail 报告 tail option used in invalid context -- 1

这是脚本的开头:

#!/bin/bash

next_stop=0;

# find the first file
start_file=$(find . -type f -exec sed '/START/F;Q' {} \;)
mv "$start_file" $start_file       # << that trick doesn't work

if [ ! -f "$start_file" ]
then
  echo "File with 'START' head not found."
  exit 1
else
    echo "Found $start_file"
fi

# parse the last line of the start file
last_line=$(tail -1 $start_file)    # << here it crashes for hacky names
echo "last line: $last_line"
if [[ $last_line == FILE* ]] ; then 
    next_file=${last_line#* }
    echo "next file from last line: $next_file"
elif [[ $last_line == STOP ]] ; then
        next_stop=true;
    else
        echo "No match for either FILE or STOP => exit"
        exit 1
    fi

我试图用这种方式用大括号包含 find 输出

mv "$start_file" $start_file

但没用

对于你这两个例子,你需要在文件名中转义space和相等(带有\字符),并且转义转义字符。 所以a a传递给tail时必须是a\ a,而a+b-c\ = e必须是a+b-c\\ \=\ e。 您可以使用 sed 进行此替换。

This example 为您提供更好更简单的替换方法:

printf '%q' "$Strange_filename"

转义字符出现此错误。 你应该用引号将它写成 start_file 变量。 last_line=$(tail -1 $start_file) --> last_line=$(tail -1 "$start_file")