PKUWWT

消遣时光

一个用于寻找文件,并便于打开文件的脚本

在Linux命令行下,通常需要根据文件名去找一个文件,然后再将文件名拷出来,小心加上引号(文件名中可能包含空格),然后,再在行首加上打开命令。这个过程甚是麻烦。

当然,你可以使用管道。但是如果有多个文件,而你只想打开其中一个呢?

下面是我的脚本,相当于是find的增强,在交互上应该让人舒服不少。

脚本中,使用了-type f-iname选项,即只寻找规则文件,并不考虑大小写。另外,擅自在模式前后加上了通配符*find总是强迫用户写出完整的模式,有时候有点多余。

 1 #!/bin/bash
 2 
 3 if (( $# < 2 )); then
 4 	echo "USAGE: $0 path pattern [find-flags]"
 5 	echo "Example: $0 . "'my*pattern -cmin 1'
 6 	echo "       Press Ctrl-C to break"
 7 	exit
 8 fi
 9 
10 open_file(){
11 	_type=${@##*.}
12 	_type=${_type,,*}
13 	cmd=xdg-open
14 	if [[ $_type == "md" ]];then cmd=vim
15 	elif [[ $_type == "pdf" ]]; then cmd=evince
16 	elif [[ $_type == "jpg" ]]; then cmd=feh
17 	fi
18 	$cmd "$@"
19 }
20 
21 
22 TMP=/tmp/__tmp_`basename $0`.txt
23 path=$1
24 pattern=$2
25 shift 2
26 
27 find $path  $@ -type f -iname "*$pattern*" >$TMP
28 NUM=`cat $TMP | wc -l`
29 cat -n $TMP
30 echo $pattern
31 
32 if [[ "-$NUM" == "-" ]];then
33 	echo "Error"
34 	exit
35 fi
36 if (( $NUM == 0 )); then 
37 	echo "No file found"
38 	exit
39 fi
40 
41 while true;do
42 	read -p "Select(1-$NUM): " ID
43 
44 	if [[ "-$ID" == "-" ]];then
45 		continue
46 	fi
47 	if ! (( $ID >= 1 && $ID <= $NUM )); then
48 		echo "Wrong Index"
49 		continue
50 	fi
51 
52 	FILE=`cat $TMP | head -$ID | tail -1`
53 
54 	open_file "$FILE"
55 done

同样,这里有几个需要备忘的bash脚本技巧:

  • 当比较数字之前,需要检测此数字是否是空字符串,否则会是错误的表达式
  • 比较字符串时,需要在前面或后面加上其它符号,同样是为了防止空字符串导致错误表达式
  • 获取文件的第2行,暂时使用head -2 | tail -1,不知还有没有更方便方法
  • 获取文件后缀: ${param##*.}
  • 将字符串大写变小写: ${param,,*}