bash: 处理奇怪的文件名尾无效选项--1
bash: dealing with strange filenames tail invalid option --1
我希望我的脚本找到第一行等于 START
的文件(在当前目录中)。然后该文件应该有 FILE <file_name>
作为最后一行。所以我想提取 <file_name>
- 我为此使用 tail
。它适用于标准文件名,但适用于非标准文件名,如 a a
或 a+b-c\ = e
,tail
报告 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")
我希望我的脚本找到第一行等于 START
的文件(在当前目录中)。然后该文件应该有 FILE <file_name>
作为最后一行。所以我想提取 <file_name>
- 我为此使用 tail
。它适用于标准文件名,但适用于非标准文件名,如 a a
或 a+b-c\ = e
,tail
报告 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")