Shell文件操作-实战篇

阅读更多

         下面是关于shell文件操作常用的使用

 

1.创建文件夹
#!/bin/sh
mkdir -m 777 "%%1"

2.创建文件
#!/bin/sh
touch "%%1"

3.删除文件
#!/bin/sh
rm -if "%%1"

4.删除文件夹
#!/bin/sh
rm -rf "%%1"

5.删除一个目录下所有的文件夹
#!/bin/bash
direc="%%1" #$(pwd)
for dir2del in $direc/* ; do
if [ -d $dir2del ]; then
  rm -rf $dir2del
fi
done

6.清空文件夹
#!/bin/bash
direc="%%1" #$(pwd)
rm -if $direc/*
for dir2del in $direc/* ; do
if [ -d $dir2del ]; then
  rm -rf $dir2del
fi
done

7.读取文件
#!/bin/sh
7.1.操作系统默认编码
cat "%%1" | while read line; do
echo $line;
done

7.2.UTF-8编码
cat "%%1" | while read line; do
echo $line;
done

7.3.分块读取
cat "%%1" | while read line; do
echo $line;
done

8.写入文件
#!/bin/sh
cat > "%%1" << EOF
%%2
EOF

tee "%%1" > /dev/null << EOF
%%2
EOF

#sed -i '$a %%2' %%2

9.写入随机文件
#!/bin/sh
cat > "%%1" << EOF
%%2
EOF

tee "%%1" > /dev/null << EOF
%%2
EOF

#sed -i '$a %%2' %%2

10.读取文件属性
#!/bin/bash
file=%%1
file=${file:?'必须给出参数'}
if [ ! -e $file ]; then
    echo "$file 不存在"
    exit 1
fi
if [ -d $file ]; then
    echo "$file 是一个目录"
    if [ -x $file ]; then
        echo "可以"
    else
        echo "不可以"
    fi
    echo "对此进行搜索"  
elif [ -f $file ]; then
    echo "$file 是一个正规文件"
else
    echo "$file不是一个正规文件"
fi
if [ -O $file ]; then
    echo "你是$file的拥有者"
else
    echo "你不是$file的拥有者"
fi
if [ -r $file ]; then
    echo "你对$file拥有"
else
    echo "你并不对$file拥有"
fi
echo "可读权限"
if [ -w $file ]; then
    echo "你对$file拥有"
else
    echo "你并不对$file拥有"
fi
echo "可写权限"
if [ -x $file -a ! -d $file ]; then
    echo "你拥有对$file"
else
    echo "你并不拥有对$file"
fi
echo "可执行的权限"

11.写入文件属性
#!/bin/bash
#修改存放在ext2、ext3、ext4、xfs、ubifs、reiserfs、jfs等文件系统上的文件或目录属性,使用权限超级用户。
#一些功能是由Linux内核版本来支持的,如果Linux内核版本低于2.2,那么许多功能不能实现。同样-D检查压缩文件中的错误的功能,需要2.5.19以上内核才能支持。另外,通过chattr命令修改属性能够提高系统的安全性,但是它并不适合所有的目录。chattr命令不能保护/、/dev、/tmp、/var目录。
chattr [-RV] [-+=AacDdijsSu] [-v version] 文件或目录
  -R:递归处理所有的文件及子目录。
  -V:详细显示修改内容,并打印输出。
  -:失效属性。
  +:激活属性。
  = :指定属性。
  A:Atime,告诉系统不要修改对这个文件的最后访问时间。
  S:Sync,一旦应用程序对这个文件执行了写操作,使系统立刻把修改的结果写到磁盘。
  a:Append Only,系统只允许在这个文件之后追加数据,不允许任何进程覆盖或截断这个文件。如果目录具有这个属性,系统将只允许在这个目录下建立和修改文件,而不允许删除任何文件。
  i:Immutable,系统不允许对这个文件进行任何的修改。如果目录具有这个属性,那么任何的进程只能修改目录之下的文件,不允许建立和删除文件。
  D:检查压缩文件中的错误。
  d:No dump,在进行文件系统备份时,dump程序将忽略这个文件。
  C:Compress,系统以透明的方式压缩这个文件。从这个文件读取时,返回的是解压之后的数据;而向这个文件中写入数据时,数据首先被压缩之后才写入磁盘。
  S:Secure Delete,让系统在删除这个文件时,使用0填充文件所在的区域。
  u:Undelete,当一个应用程序请求删除这个文件,系统会保留其数据块以便以后能够恢复删除这个文件。

12.枚举一个目录中的所有文件夹
#!/bin/bash
OLDIFS=$IFS
IFS=:
for path in $( find "%%1" -type d -printf "%p$IFS")
do
#"$path"
done
IFS=$OLDIFS

13.复制文件夹
#!/bin/sh
cp -rf "%%1" "%%2"

14.复制一个目录下所有的文件夹到另一个目录下
#!/bin/bash
direc="%%1" #$(pwd)
for dir2cp in $direc/* ; do
if [ -d $dir2cp ]; then
  cp $dir2cp "%%2"
fi
done

15.移动文件夹
#!/bin/sh
mv -rf "%%1" "%%2"

16.移动一个目录下所有的文件夹到另一个目录下
#!/bin/bash
direc="%%1" #$(pwd)
for dir2mv in $direc/* ; do
if [ -d $dir2mv ]; then
  mv $dir2mv "%%2"
fi
done

17.以一个文件夹的框架在另一个目录下创建文件夹和空文件
#!/bin/bash
direc="%%1" #$(pwd)
OLDIFS=$IFS
IFS=:
for path in $( find $direc -type d -printf "%p$IFS")
do
mkdir -p "%%2/${path:${#direc}+1}"
done
IFS=$OLDIFS
#cp -a "%%1" "%%2"

表达式 含义
${#string}
{#string}
1,取得字符串长度
string=abc12342341          //等号二边不要有空格
echo ${#string}             //结果11
expr length $string         //结果11
expr "$string" : ".*"       //结果11 分号二边要有空格,这里的:根match的用法差不多2,字符串所在位置
expr index $string '123'    //结果4 字符串对应的下标是从0开始的这个方法让我想起来了js的indexOf,各种语言对字符串的操作方法大方向都差不多,如果有语言基础的话,学习shell会很快的。
3,从字符串开头到子串的最大长度
expr match $string 'abc.*3' //结果9个人觉得这个函数的用处不大,为什么要从开头开始呢。
4,字符串截取
echo ${string:4}      //2342341  从第4位开始截取后面所有字符串
echo ${string:3:3}    //123      从第3位开始截取后面3位
echo ${string:3:6}    //123423   从第3位开始截取后面6位
echo ${string: -4}    //2341  :右边有空格   截取后4位
echo ${string:(-4)}   //2341  同上
expr substr $string 3 3   //123  从第3位开始截取后面3位上面的方法让我想起了,php的substr函数,后面截取的规则是一样的。
5,匹配显示内容
//例3中也有match和这里的match不同,上面显示的是匹配字符的长度,而下面的是匹配的内容
expr match $string '\([a-c]*[0-9]*\)'  //abc12342341
expr $string : '\([a-c]*[0-9]\)'       //abc1
expr $string : '.*\([0-9][0-9][0-9]\)' //341 显示括号中匹配的内容这里括号的用法,是不是根其他的括号用法有相似之处呢,
6,截取不匹配的内容
echo ${string#a*3}     //42341  从$string左边开始,去掉最短匹配子串
echo ${string#c*3}     //abc12342341  这样什么也没有匹配到
echo ${string#*c1*3}   //42341  从$string左边开始,去掉最短匹配子串
echo ${string##a*3}    //41     从$string左边开始,去掉最长匹配子串
echo ${string%3*1}     //abc12342  从$string右边开始,去掉最短匹配子串
echo ${string%%3*1}    //abc12     从$string右边开始,去掉最长匹配子串这里要注意,必须从字符串的第一个字符开始,或者从最后一个开始,
7,匹配并且替换
echo ${string/23/bb}   //abc1bb42341  替换一次
echo ${string//23/bb}  //abc1bb4bb41  双斜杠替换所有匹配
echo ${string/#abc/bb} //bb12342341   #以什么开头来匹配,根php中的^有点像
echo ${string/%41/bb}  //abc123423bb  %以什么结尾来匹配,根php中的$有点像

#!/bin/bash
direc=$(pwd)
for file in "$(direc)/*"
do
if [ "${file##*.}" = "sh" ]; then
xterm -e bash $file
elif [ "${file##*.}" = "bin" ]; then
xterm -e $file
elif [ "${file##*.}" = "run" ]; then
xterm -e $file
elif [ "${file##*.}" = "bundle" ]; then
xterm -e $file
elif [ "${file##*.}" = "pl" ]; then
xterm -e perl $file
elif [ "${file##*.}" = "class" ]; then
xterm -e java ${file%.*}
elif [ "${file##*.}" = "rpm" ]; then
xterm -e rpm -ivh $file
elif [ "${file##*.}" = "rb" ]; then
xterm -e ruby $file
elif [ "${file##*.}" = "py" ]; then
xterm -e python $file
elif [ "${file##*.}" = "jar" ]; then
xterm -e java -jar $file
fi
done
OLDIFS=$IFS
IFS=:
for path in $( find $direc -type d -printf "%p$IFS")
do
for file in `ls $path`
do
if [ "${file##*.}" = "sh" ]; then
xterm -e bash """"$path"/"$file""""
elif [ "${file##*.}" = "bin" ]; then
xterm -e """"$path"/"$file""""
elif [ "${file##*.}" = "run" ]; then
xterm -e """"$path"/"$file""""
elif [ "${file##*.}" = "bundle" ]; then
xterm -e """"$path"/"$file""""
elif [ "${file##*.}" = "pl" ]; then
xterm -e perl """"$path"/"$file""""
elif [ "${file##*.}" = "class" ]; then
xterm -e java """"$path"/"${file%.*}""""
elif [ "${file##*.}" = "rpm" ]; then
xterm -e rpm -ivh """"$path"/"$file""""
elif [ "${file##*.}" = "rb" ]; then
xterm -e ruby """"$path"/"$file""""
elif [ "${file##*.}" = "py" ]; then
xterm -e python """"$path"/"$file""""
elif [ "${file##*.}" = "jar" ]; then
xterm -e java -jar """"$path"/"$file""""
fi
done
done
IFS=$OLDIFS

18.复制文件
#!/bin/sh
cp %%1 %%2

19.复制一个目录下所有的文件到另一个目录
#!/bin/bash
direc="%%1" $(pwd)
for file in "$direc/*"
do
cp "$file" "%%1"
done

20.提取扩展名
#!/bin/sh
%%2=${%%1##.}

21.提取文件名
#!/bin/sh
%%2="$(basename %%1)"

22.提取文件路径
#!/bin/sh
%%2="$(dirname %%1)"

23.替换扩展名
#!/bin/sh
%%3="$(basename %%1)$%%2"

24.追加路径
#!/bin/sh
%%3="$(dirname %%1)/$%%2"

25.移动文件
#!/bin/sh
mv "%%1" "%%2"

26.移动一个目录下所有文件到另一个目录
#!/bin/bash
direc="%%1" #$(pwd)
OLDIFS=$IFS
IFS=:
for file in "$(direc)/*"
do
mv "$file" "%%1"
done
IFS=$OLDIFS

27.指定目录下搜索文件
#!/bin/sh
find -name "%%1"

28.打开文件对话框
#!/bin/sh
%%1="$(Xdialog --fselect '~/' 0 0 2>&1)"

29.文件分割
#!/bin/sh
split -b 2k "%%1"

while read f1 f2 f3
do
    echo $f1 >> f1
    echo $f2 >> f2
    echo $f3 >> f3
done


#!/bin/bash
  linenum=`wc   -l   httperr8007.log|   awk   '{print   $1}'`  
  n1=1  
  file=1  
  while   [   $n1   -lt   $linenum   ]  
  do  
                  n2=`expr   $n1   +   999`  
                  sed   -n   "${n1},   ${n2}p"   httperr8007.log >   file_$file.log    
                  n1=`expr   $n2   +   1`  
                  file=`expr   $file   +   1`  
  done  




其中httperr8007.log为你想分割的大文件,file_$file.log  为分割后的文件,最后为file_1.log,file_2.log,file_3.log……,分割完后的每个文件只有1000行(参数可以自己设置)

split 参数:
-b  :后面可接欲分割成的档案大小,可加单位,例如 b, k, m 等;
-l  :以行数来进行分割;



#按每个文件1000行来分割除

split -l 1000 httperr8007.log httperr

httpaa,httpab,httpac ........

#按照每个文件100K来分割

split -b 100k httperr8007.log http

httpaa,httpab,httpac ........

#!/bin/bash
if [ $# -ne 2 ]; then
echo 'Usage: split file size(in bytes)'
exit
fi

file=$1
size=$2

if [ ! -f $file ]; then
echo "$file doesn't exist"
exit
fi

#TODO: test if $size is a valid integer

filesize=`/bin/ls -l $file | awk '{print $5}'`
echo filesize: $filesize

let pieces=$filesize/$size
let remain=$filesize-$pieces*$size
if [ $remain -gt 0 ]; then
let pieces=$pieces+1
fi
echo pieces: $pieces

i=0
while [ $i -lt $pieces ];
do
echo split: $file.$i:
dd if=$file of=$file.$i bs=$size count=1 skip=$i
let i=$i+1
done

echo "#!/bin/bash" > merge

echo "i=0" >> merge
echo "while [ $i -lt $pieces ];" >> merge
echo "do" >> merge
echo " echo merge: $file.$i" >> merge
echo " if [ ! -f $file.$i ]; then" >> merge
echo " echo merge: $file.$i missed" >> merge
echo " rm -f $file.merged" >> merge
echo " exit" >> merge
echo " fi" >> merge
echo " dd if=$file.$i of=$file.merged bs=$size count=1 seek=$i" >> merge
echo " let i=$i+1" >> merge
echo "done" >> merge
chmod u+x merge'

30.文件合并
#!/bin/sh
cp "%%1"+"%%2" "%%3"

exec 3> join.txt
done

#!/bin/bash
if [ $# -ne 2 ]; then
echo 'Usage: split file size(in bytes)'
exit
fi

file=$1
size=$2

if [ ! -f $file ]; then
echo "$file doesn't exist"
exit
fi

#TODO: test if $size is a valid integer

filesize=`/bin/ls -l $file | awk '{print $5}'`
echo filesize: $filesize

let pieces=$filesize/$size
let remain=$filesize-$pieces*$size
if [ $remain -gt 0 ]; then
let pieces=$pieces+1
fi
echo pieces: $pieces

i=0
while [ $i -lt $pieces ];
do
echo split: $file.$i:
dd if=$file of=$file.$i bs=$size count=1 skip=$i
let i=$i+1
done

echo "#!/bin/bash" > merge

echo "i=0" >> merge
echo "while [ $i -lt $pieces ];" >> merge
echo "do" >> merge
echo " echo merge: $file.$i" >> merge
echo " if [ ! -f $file.$i ]; then" >> merge
echo " echo merge: $file.$i missed" >> merge
echo " rm -f $file.merged" >> merge
echo " exit" >> merge
echo " fi" >> merge
echo " dd if=$file.$i of=$file.merged bs=$size count=1 seek=$i" >> merge
echo " let i=$i+1" >> merge
echo "done" >> merge
chmod u+x merge'

31.文件简单加密
#!/bin/bash
#make test && make strings && sudo make install
shc -r -f %%1.sh
#%%1.x
#%%1.x.c

32.文件简单解密
#!/bin/bash
#make test && make strings && sudo make install
shc -r -f %%1.sh
#%%1.x
#%%1.x.c

33.读取ini文件属性
#!/bin/bash
if [ "$%%3" = "" ];then
   sed -n "/\[$%%2\]/,/\[.*\]/{
   /^\[.*\]/d
   /^[ ]*$/d
   s/;.*$//
   p
   }" $1
elif [ "$%%4" = "" ];then
   sed -n "/\[$%%2\]/,/\[.*\]/{
   /^\[.*\]/d
   /^[ ]*$/d
   s/;.*$//
   s/^[ |        ]*$%%3[ | ]*=[ |   ]*\(.*\)[ |     ]*/\1/p
   }" $1
else
       if [ "$%%4" = "#" ];then
            sed "/\[$%%2\]/,/\[.*\]/{
            s/^[ |        ]*$%%3[ |    ]*=.*/ /
            }p" $1 > /tmp/sed$$
            mv /tmp/sed$$ $1
       else
            sed "/\[$2\]/,/\[.*\]/{
            s/^[ |        ]*$%%3[ |    ]*=.*/$%%3=$%%4/
            }p" $1 > /tmp/sed$$
            mv /tmp/sed$$ $%%1
       fi
fi

34.合并一个文件下所有的文件
#!/bin/sh
cat $(ls |grep -E '%%1\.') > %%1

#!/bin/bash
OLDIFS=$IFS
IFS=:
for path in $( find %%1 -type d -printf "%p$IFS")
do
for file in $path/*.c $path/*.cpp
do
if [[ ! "$file" =~ \*.[A-Za-z]+ ]]; then
#"$(path)/$(file)"
fi
done
done
IFS=$OLDIFS

#!/bin/bash
cat <<'EOF'> combine.c
#include
int main()
{
FILE *f1,*f2,*f3;
f1=fopen("a1.txt","r");
f2=fopen("a2.txt","r");
f3=fopen("a3.txt","w");
int a,b;
a=getw(f1);   /*从a1.txt和a2.txt中分别取最小的数a和b*/
b=getw(f2);
while(!feof(f1)&&!feof(f2))  /*两个文件都没结束时,执行循环、比较*/
{
if(a<=b)
{
putw(a,f3);
a=getw(f1);
}
else
{putw(b,f3);
b=getw(f2);
}
   }
if(feof(f1))  /*文件a1.txt结束时,把a2.txt中的数全部输入a3.txt*/
{putw(b,f3);
while((b=getw(f2))!=EOF)
putw(b,f3);
}
if(feof(f2))   /*同上*/
{
putw(a,f3);
while((a=getw(f1))!=EOF)
putw(a,f3);
}
fclose(f1);
fclose(f2);
fclose(f3);
printf("已完成!");
return 0;
}
EOF
gcc -o combine combine.c
if [ $? -eq 0 ]; then
./combine
else
echo 'Compile ERROR'
fi

35.写入ini文件属性
#!/bin/bash
if [ "$%%3" = "" ];then
   sed -n "/\[$%%2\]/,/\[.*\]/{
   /^\[.*\]/d
   /^[ ]*$/d
   s/;.*$//
   p
   }" $1
elif [ "$%%4" = "" ];then
   sed -n "/\[$%%2\]/,/\[.*\]/{
   /^\[.*\]/d
   /^[ ]*$/d
   s/;.*$//
   s/^[ |        ]*$%%3[ | ]*=[ |   ]*\(.*\)[ |     ]*/\1/p
   }" $1
else
       if [ "$%%4" = "#" ];then
            sed "/\[$%%2\]/,/\[.*\]/{
            s/^[ |        ]*$%%3[ |    ]*=.*/ /
            }p" $1 > /tmp/sed$$
            mv /tmp/sed$$ $%%1
       else
            sed "/\[$%%2\]/,/\[.*\]/{
            s/^[ |        ]*$%%3[ |    ]*=.*/$%%3=$%%4/
            }p" $1 > /tmp/sed$$
            mv /tmp/sed$$ $%%1
       fi
fi

36.获得当前路径
#!/bin/sh
%%1=$(pwd)

37.读取XML数据库

如何通过shell命令行读取xml文件中某个属性所对应的值?
例如:
BuildVersion 5
我希望能够通过Unix shell命令对属性键的名称BuildVersion进行查询,返回的结果是5,如何实现呀?
#!/bin/bash
grep BuildVersion|sed 's/.*<.*>\([^<].*\)<.*>.*/\1/'

结果返回的是“BuildVersion”,而不是“5”,如果要查询BuildVersion自动返回数值5应当如何写?

应该没错的。试一下: echo "BuildVersion 5"|grep BuildVersion|sed 's/.*<.*>\([^<].*\)<.*>.*/\1/'我在SL的终端里试,返回值是5

目前需要从xml文件提取数据,想做一个xmlparser.sh
xml 类似这样

   



希望输入 xmlparser.sh a.xml hostip可以返回192.168.0.1


#!/bin/sh

if [ $# -ne 2 ];then
   echo "Usage: $0  "
   exit 0
fi

grep $2 $1|awk '{print $2}'|grep -o "[0-9.]*"


把
grep $2 $1|awk '{print $2}'|grep -o "[0-9.]*"
改成
grep $2 $1|awk '{print $2}'|grep -Eo "[0-9.]+"
楼上这个有问题,如果我要得到的是

   

中的sharename,那么,呵呵,就错了

我觉得应该先定位到第二个参数“$2”的位置,然后再提取“=”后面的内容

这里有个完整的实现:
Parse Simple XML Files using Bash – Extract Name Value Pairs and Attributes
http://www.humbug.in/2010/parse-simple-xml-files-using-bash-extract-name-value-pairs-and-attributes/


不过需要安装xmllint.

设计到对多个xml文件进行element的读取和列表。有人做过么?
举个例子,
多个xml文件里面都有
xxx</titlel> </article> 通过shell读取,然后合并到一起,再生成一个新的xml,但是其他元素不变。 <article> <title>aaa</titlel> </article> <article> <title>bbb</titlel> </article> 如果格式异常简单,没有特例,那么可以用shell实现 如果有可能格式复杂,因为shell的命令所使用的正则表达式都不支持跨行匹配,所以用shell来解决这个问题就绕圈子了。 用perl来作这个工作最直接、简单。perl的XML:DOM模块是专门处理XML文件的。 偶倒是觉得,用PHP写Scripts也很方便,功能强大,而且,跨平台, #!/bin/sh sed -n '/<article>/{ N; /\n[[:space:]]*<title>/{ N; /<article>.*<\/article>/p } D; n }' 这小段代码能把一个xml文件中,你要的东西拿出来. 你可以用for file in $*把这些信息都>>tmpfile中. 然后用sed 在指定文件的指定位置用r命令把tmpfile粘贴进来~~~~ 大思路如此^_^ 我想有这个东西(只要能正确的跑出结果)后面就不难了吧... Name xmllint — command line XML tool Synopsis xmllint [[--version] | [--debug] | [--shell] | [--debugent] | [--copy] | [--recover] | [--noent] | [--noout] | [--nonet] | [--htmlout] | [--nowrap] | [--valid] | [--postvalid] | [--dtdvalid URL] | [--dtdvalidfpi FPI] | [--timing] | [--output file] | [--repeat] | [--insert] | [--compress] | [--html] | [--xmlout] | [--push] | [--memory] | [--maxmem nbbytes] | [--nowarning] | [--noblanks] | [--nocdata] | [--format] | [--encode encoding] | [--dropdtd] | [--nsclean] | [--testIO] | [--catalogs] | [--nocatalogs] | [--auto] | [--xinclude] | [--noxincludenode] | [--loaddtd] | [--dtdattr] | [--stream] | [--walker] | [--pattern patternvalue] | [--chkregister] | [--relaxng] | [--schema] | [--c14n]] [xmlfile] Introduction The xmllint program parses one or more XML files, specified on the command line as xmlfile. It prints various types of output, depending upon the options selected. It is useful for detecting errors both in XML code and in the XML parser itself. It is included in libxml2. Options --version Display the version of libxml2 used. --debug Parse a file and output an annotated tree of the in-memory version of the document. --shell Run a navigating shell. Details on available commands in shell mode are below. --debugent Debug the entities defined in the document. --copy Test the internal copy implementation. --recover Output any parsable portions of an invalid document. --noent Substitute entity values for entity references. By default, xmllint leaves entity references in place. --nocdata Substitute CDATA section by equivalent text nodes. --nsclean Remove redundant namespace declarations. --noout Suppress output. By default, xmllint outputs the result tree. --htmlout Output results as an HTML file. This causes xmllint to output the necessary HTML tags surrounding the result tree output so the results can be displayed in a browser. --nowrap Do not output HTML doc wrapper. --valid Determine if the document is a valid instance of the included Document Type Definition (DTD). A DTD to be validated against also can be specified at the command line using the --dtdvalid option. By default, xmllint also checks to determine if the document is well-formed. --postvalid Validate after parsing is completed. --dtdvalid URL Use the DTD specified by URL for validation. --dtdvalidfpi FPI Use the DTD specified by the Public Identifier FPI for validation, note that this will require a Catalog exporting that Public Identifier to work. --timing Output information about the time it takes xmllint to perform the various steps. --output file Define a file path where xmllint will save the result of parsing. Usually the programs build a tree and save it on stdout, with this option the result XML instance will be saved onto a file. --repeat Repeat 100 times, for timing or profiling. --insert Test for valid insertions. --compress Turn on gzip compression of output. --html Use the HTML parser. --xmlout Used in conjunction with --html. Usually when HTML is parsed the document is saved with the HTML serializer, but with this option the resulting document is saved with the XML serializer. This is primarily used to generate XHTML from HTML input. --push Use the push mode of the parser. --memory Parse from memory. --maxmem nnbytes Test the parser memory support. nnbytes is the maximum number of bytes the library is allowed to allocate. This can also be used to make sure batch processing of XML files will not exhaust the virtual memory of the server running them. --nowarning Do not emit warnings from the parser and/or validator. --noblanks Drop ignorable blank spaces. --format Reformat and reindent the output. The $XMLLINT_INDENT environment variable controls the indentation (default value is two spaces " "). --testIO Test user input/output support. --encode encoding Output in the given encoding. --catalogs Use the catalogs from $SGML_CATALOG_FILES. Otherwise /etc/xml/catalog is used by default. --nocatalogs Do not use any catalogs. --auto Generate a small document for testing purposes. --xinclude Do XInclude processing. --noxincludenode Do XInclude processing but do not generate XInclude start and end nodes. --loaddtd Fetch external DTD. --dtdattr Fetch external DTD and populate the tree with inherited attributes. --dropdtd Remove DTD from output. --stream Use streaming API - useful when used in combination with --relaxng or --valid options for validation of files that are too large to be held in memory. --walker Test the walker module, which is a reader interface but for a document tree, instead of using the reader API on an unparsed document it works on a existing in-memory tree. Used in debugging. --chkregister Turn on node registration. Useful for developers testing libxml2 node tracking code. --pattern patternvalue Used to exercise the pattern recognition engine, which can be used with the reader interface to the parser. It allows to select some nodes in the document based on an XPath (subset) expression. Used for debugging. --relaxng schema Use RelaxNG file named schema for validation. --schema schema Use a W3C XML Schema file named schema for validation. --c14n Use the W3C XML Canonicalisation (C14N) to serialize the result of parsing to stdout. It keeps comments in the result. Shell xmllint offers an interactive shell mode invoked with the --shell command. Available commands in shell mode include: base display XML base of the node bye leave shell cat node Display node if given or current node. cd path Change the current node to path (if given and unique) or root if no argument given. dir path Dumps information about the node (namespace, attributes, content). du path Show the structure of the subtree under path or the current node. exit Leave the shell. help Show this help. free Display memory usage. load name Load a new document with the given name. ls path List contents of path (if given) or the current directory. pwd Display the path to the current node. quit Leave the shell. save name Saves the current document to name if given or to the original name. validate Check the document for error. write name Write the current node to the given filename. Catalogs Catalog behavior can be changed by redirecting queries to the user's own set of catalogs. This can be done by setting the XML_CATALOG_FILES environment variable to a list of catalogs. An empty one should deactivate loading the default /etc/xml/catalog default catalog. Debugging Catalogs Setting the environment variable XML_DEBUG_CATALOG using the command "export XML_DEBUG_CATALOG=" outputs debugging information related to catalog operations. Error Return Codes On the completion of execution, Xmllint returns the following error codes: 0 No error 1 Unclassified 2 Error in DTD 3 Validation error 4 Validation error 5 Error in schema compilation 6 Error writing output 7 Error in pattern (generated when [--pattern] option is used) 8 Error in Reader registration (generated when [--chkregister] option is used) 9 Out of memory error Parse Simple XML Files using Bash – Extract Name Value Pairs and Attributes 2 Comments 1 Tweet Pratik Sinha | July 31, 2010 I have written up a simple routine par***ML to parse simple XML files to extract unique name values pairs and their attributes. The script extracts all xml tags of the format <abc arg1="hello">xyz</abc> and dynamically creates bash variables which hold values of the attributes as well as the elements. This is a good solution, if you don’t wish to use xpath for some simple xml files. However you will need xmllint installed on your system to use the script. Here’s a sample script which uses the par***ML function #!/bin/bash xmlFile=$1 function par***ML() { elemList=( $(cat $xmlFile | tr '\n' ' ' | XMLLINT_INDENT="" xmllint --format - | /bin/grep -e "</.*>$" | while read line; do \ echo $line | sed -e 's/^.*<\///' | cut -d '>' -f 1; \ done) ) totalNoOfTags=${#elemList[@]}; ((totalNoOfTags--)) suffix=$(echo ${elemList[$totalNoOfTags]} | tr -d '</>') suffix="${suffix}_" for (( i = 0 ; i < ${#elemList[@]} ; i++ )); do elem=${elemList[$i]} elemLine=$(cat $xmlFile | tr '\n' ' ' | XMLLINT_INDENT="" xmllint --format - | /bin/grep "</$elem>") echo $elemLine | grep -e "^</[^ ]*>$" 1>/dev/null 2>&1 if [ "0" = "$?" ]; then continue fi elemVal=$(echo $elemLine | tr '\011' '\040'| sed -e 's/^[ ]*//' -e 's/^<.*>\([^<].*\)<.*>$/\1/' | sed -e 's/^[ ]*//' | sed -e 's/[ ]*$//') xmlElem="${suffix}$(echo $elem | sed 's/-/_/g')" eval ${xmlElem}=`echo -ne \""${elemVal}"\"` attrList=($(cat $xmlFile | tr '\n' ' ' | XMLLINT_INDENT="" xmllint --format - | /bin/grep "</$elem>" | tr '\011' '\040' | sed -e 's/^[ ]*//' | cut -d '>' -f 1 | sed -e 's/^<[^ ]*//' | tr "'" '"' | tr '"' '\n' | tr '=' '\n' | sed -e 's/^[ ]*//' | sed '/^$/d' | tr '\011' '\040' | tr ' ' '>')) for (( j = 0 ; j < ${#attrList[@]} ; j++ )); do attr=${attrList[$j]} ((j++)) attrVal=$(echo ${attrList[$j]} | tr '>' ' ') attrName=`echo -ne ${xmlElem}_${attr}` eval ${attrName}=`echo -ne \""${attrVal}"\"` done done } par***ML echo "$status_xyz | $status_abc | $status_pqr" #Variables for each XML ELement echo "$status_xyz_arg1 | $status_abc_arg2 | $status_pqr_arg3 | $status_pqr_arg4" #Variables for each XML Attribute echo "" #All the variables that were produced by the par***ML function set | /bin/grep -e "^$suffix" The XML File used for the above script example is: <?xml version="1.0"?> <status> <xyz arg1="1"> a </xyz> <abc arg2="2"> p </abc> <pqr arg3="3" arg4="a phrase"> x </pqr> </status> The root tag, which in this case is “status”, is used as a suffix for all variables. Once the XML file is passed to the function, it dynamically creates the variables $status_xyz, $status_abc, $status_pqr, $status_xyz_arg1, $status_abc_arg2, $status_pqr_arg3 and $status_pqr_arg4. The output when the script is ran with the xml file as an argument is @$ bash par***ML.sh test.xml a | p | x 1 | 2 | 3 | a phrase status_abc=p status_abc_arg2=2 status_pqr=x status_pqr_arg3=3 status_pqr_arg4='a phrase' status_xyz=a status_xyz_arg1=1 This script won’t work for XML files like the one below with duplicate element names. <?xml version="1.0"?> <status> <test arg1="1"> a </test> <test arg2="2"> p </test> <test arg3="3" arg4="a phrase"> x </test> </status> This script also won’t be able to extract attributes of elements without any CDATA. For eg, the script won’t be able to create variables corresponding to <test arg1="1">. It will only create the variables corresponding to <test1 arg2="2">abc</test1>. <?xml version="1.0"?> <status> <test arg1="1"> <test1 arg2="2">abc</test1> </test> </status> 38.写入XML数据库 #!/bin/bash 39.ZIP压缩文件 #!/bin/sh zip -r "/%%1" "%%2" 40.ZIP解压缩 #!/bin/sh unzip -x "/%%1" "%%2" 41.获得应用程序完整路径 #!/bin/bash 42.ZIP压缩文件夹 #!/bin/bash 43.递归删除目录下的文件 #!/bin/bash rm -if "%%1/*" OLDIFS=$IFS IFS=: for path in $( find %%1 -type d -printf "%p$IFS") do for file in $path/*.c $path/*.cpp do if [[ ! "$file" =~ \*.[A-Za-z]+ ]]; then #"$(path)/$(file)" fi done done IFS=$OLDIFS 44.IDEA加密算法 #!/bin/bash 45.RC6算法 #!/bin/bash cat <<'EOF'> rc6.c #include<stdio.h> /* Timing data for RC6 (rc6.c) 128 bit key: Key Setup: 1632 cycles Encrypt: 270 cycles = 94.8 mbits/sec Decrypt: 226 cycles = 113.3 mbits/sec Mean: 248 cycles = 103.2 mbits/sec 192 bit key: Key Setup: 1885 cycles Encrypt: 267 cycles = 95.9 mbits/sec Decrypt: 235 cycles = 108.9 mbits/sec Mean: 251 cycles = 102.0 mbits/sec 256 bit key: Key Setup: 1877 cycles Encrypt: 270 cycles = 94.8 mbits/sec Decrypt: 227 cycles = 112.8 mbits/sec Mean: 249 cycles = 103.0 mbits/sec */ #include "../std_defs.h" static char *alg_name[] = { "rc6", "rc6.c", "rc6" }; char **cipher_name() { return alg_name; } #define f_rnd(i,a,b,c,d) \ u = rotl(d * (d + d + 1), 5); \ t = rotl(b * (b + b + 1), 5); \ a = rotl(a ^ t, u) + l_key; \ c = rotl(c ^ u, t) + l_key[i + 1] #define i_rnd(i,a,b,c,d) \ u = rotl(d * (d + d + 1), 5); \ t = rotl(b * (b + b + 1), 5); \ c = rotr(c - l_key[i + 1], t) ^ u; \ a = rotr(a - l_key, u) ^ t u4byte l_key[44]; /* storage for the key schedule */ /* initialise the key schedule from the user supplied key */ u4byte *set_key(const u4byte in_key[], const u4byte key_len) { u4byte i, j, k, a, b, l[8], t; l_key[0] = 0xb7e15163; for(k = 1; k < 44; ++k) l_key[k] = l_key[k - 1] + 0x9e3779b9; for(k = 0; k < key_len / 32; ++k) l[k] = in_key[k]; t = (key_len / 32) - 1; // t = (key_len / 32); a = b = i = j = 0; for(k = 0; k < 132; ++k) { a = rotl(l_key + a + b, 3); b += a; b = rotl(l[j] + b, b); l_key = a; l[j] = b; i = (i == 43 ? 0 : i + 1); // i = (i + 1) % 44; j = (j == t ? 0 : j + 1); // j = (j + 1) % t; } return l_key; }; /* encrypt a block of text */ void encrypt(const u4byte in_blk[4], u4byte out_blk[4]) { u4byte a,b,c,d,t,u; a = in_blk[0]; b = in_blk[1] + l_key[0]; c = in_blk[2]; d = in_blk[3] + l_key[1]; f_rnd( 2,a,b,c,d); f_rnd( 4,b,c,d,a); f_rnd( 6,c,d,a,b); f_rnd( 8,d,a,b,c); f_rnd(10,a,b,c,d); f_rnd(12,b,c,d,a); f_rnd(14,c,d,a,b); f_rnd(16,d,a,b,c); f_rnd(18,a,b,c,d); f_rnd(20,b,c,d,a); f_rnd(22,c,d,a,b); f_rnd(24,d,a,b,c); f_rnd(26,a,b,c,d); f_rnd(28,b,c,d,a); f_rnd(30,c,d,a,b); f_rnd(32,d,a,b,c); f_rnd(34,a,b,c,d); f_rnd(36,b,c,d,a); f_rnd(38,c,d,a,b); f_rnd(40,d,a,b,c); out_blk[0] = a + l_key[42]; out_blk[1] = b; out_blk[2] = c + l_key[43]; out_blk[3] = d; }; /* decrypt a block of text */ void decrypt(const u4byte in_blk[4], u4byte out_blk[4]) { u4byte a,b,c,d,t,u; d = in_blk[3]; c = in_blk[2] - l_key[43]; b = in_blk[1]; a = in_blk[0] - l_key[42]; i_rnd(40,d,a,b,c); i_rnd(38,c,d,a,b); i_rnd(36,b,c,d,a); i_rnd(34,a,b,c,d); i_rnd(32,d,a,b,c); i_rnd(30,c,d,a,b); i_rnd(28,b,c,d,a); i_rnd(26,a,b,c,d); i_rnd(24,d,a,b,c); i_rnd(22,c,d,a,b); i_rnd(20,b,c,d,a); i_rnd(18,a,b,c,d); i_rnd(16,d,a,b,c); i_rnd(14,c,d,a,b); i_rnd(12,b,c,d,a); i_rnd(10,a,b,c,d); i_rnd( 8,d,a,b,c); i_rnd( 6,c,d,a,b); i_rnd( 4,b,c,d,a); i_rnd( 2,a,b,c,d); out_blk[3] = d - l_key[1]; out_blk[2] = c; out_blk[1] = b - l_key[0]; out_blk[0] = a; }; int main() { return 0; } EOF gcc -o rc6 rc6.c if [ $? -eq 0 ]; then ./combine else echo 'Compile ERROR' fi 46.Grep #!/bin/bash grep -qE %%1 %%2 47.直接创建多级目录 #!/bin/bash mkdir -p %%1 48.批量重命名 #!/bin/bash find $PWD -type f -name '*\.cpp' |sed s/'\.cpp'//g|awk '{MV = "mv"};{C = "\.c"};{ CPP="\.cpp"}; {print MV, $1 CPP , $1 C}'|sh ls | awk -F '-' '{print "mv "$0" "$2}' #去掉带'-'的前缀 49.文本查找替换 #!/bin/bash sed -e 's:%%2:%%3:g' %%1 #sed -e 's/%%2/%%3/g' %%1 50.文件关联 #!/bin/bash 51.批量转换编码从GB2312到Unicode #!/bin/bash scode="gbk" dcode="ucs2" for FILE in $(find $(pwd) -type f) do TMP_file=$(mktemp -p $(pwd)) if [ -f $FILE ]; then Fright=$(stat -c %a $FILE) Fuser=$(stat -c %U $FILE) Fgrp=$(stat -c %G $FILE) iconv -f $scode -t $dcode $FILE -o $TMP_file mv $TMP_file $FILE chmod $Fright $FILE chown $Fuser.$Fgrp $FILE fi done 52.设置JDK环境变量 #!/bin/bash find "$PWD" -type f \( -iname '*.bin' \) -print0 | xargs -0 chmod +x find -type f \( -iname '*.bin' \) -print | while read filename do case "$filename" in *.bin) xterm -e "$filename" && rm -if "$filename" ;; esac done OLDIFS=$IFS IFS=$'\n' for line in `cat ~/.bashrc` do if [[ "$line" =~ .*export.* ]]; then if [[ "$line" =~ .*JAVA_HOME=.* ]]; then if [[ "$line" =~ =(\/([0-9a-zA-Z._]+))+ ]]; then javahome=$line fi fi fi if [[ "$line" =~ export\ PATH=\$PATH:\$JAVA_HOME/bin:\$JAVA_HOME/jre/bin$ ]];then javapath=$line fi if [[ "$line" =~ export\ CLASSPATH=.:\$JAVA_HOME/lib:\$JAVA_HOME/jre/lib$ ]];then classpath=$line fi done if [ ! -n "$javahome" ]; then sed -i '$a export JAVA_HOME='$(pwd)'/jdk1.6.0_25' ~/.bashrc else sed -i 's:'${javahome//\\/\\\\}':export JAVA_HOME='$(pwd)'/jdk1.6.0_32:g' ~/.bashrc fi if [ ! -n "$javapath" ]; then sed -i '$a export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin' ~/.bashrc fi if [ ! -n "$classpath" ]; then sed -i '$a export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib' ~/.bashrc fi IFS=$OLDIFS #!/bin/bash shift OLDIFS=$IFS IFS=$'\n' for line in `cat ~/TestBash.txt` #~/.bashrc do if [[ "$line" =~ .*export.* ]]; then if [[ "$line" =~ export\ CLASSPATH=.:\$JAVA_HOME/lib:\$JAVA_HOME/jre/lib$ ]]; then classpath=$line elif [[ "$line" =~ export\ PATH=\$PATH:\$CATALINA_HOME/bin$ ]]; then jbosspath=$line fi if [[ "$line" =~ .*JAVA_HOME=.* ]]; then if [[ "$line" =~ =(\/([0-9a-zA-Z._]+))+ ]];then javahome=$line fi elif [[ "$line" =~ .*CATALINA_HOME=.* ]];then if [[ "$line" =~ =(\/([0-9a-zA-Z._]+))+ ]];then catalinahome=$line fi elif [[ "$line" =~ .*TOMCAT_HOME=.* ]];then if [[ "$line" =~ =(\/([0-9a-zA-Z._]+))+ ]];then tomcathome=$line fi elif [[ "$line" =~ .*CATALINA_BASE=.* ]];then if [[ "$line" =~ =(\/([0-9a-zA-Z._]+))+ ]];then catalinabase=$line fi elif [[ "$line" =~ .*JBOSS_HOME=.* ]];then if [[ "$line" =~ =(\/([0-9a-zA-Z._]+))+ ]];then jbosshome=$line fi fi elif [[ "$line" =~ ^PATH=\$PATH:\$JAVA_HOME/bin:\$JAVA_HOME/jre/bin$ ]];then javapath=$line fi if [[ "$line" =~ export\ CLASSPATH=.:\$JAVA_HOME/lib:\$JAVA_HOME/jre/lib$ ]];then classpath=$line fi if [[ "$line" =~ export\ PATH=\$PATH:\$JBOSS_HOME/bin$ ]];then jbosspath=$line fi done if [ ! -n "$javahome" ]; then sed -i '$a export JAVA_HOME='$(pwd)'/jdk1.6.0_24' ~/TestBash.txt #~/.bashrc else sed -i 's:'${javahome//\\/\\\\}':export JAVA_HOME='$(pwd)'/jdk1.6.0_24:g' ~/TestBash.txt fi if [ ! -n "$javapath" ]; then sed -i '$a PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin' ~/TestBash.txt #~/.bashrc fi if [ ! -n "$classpath" ]; then sed -i '$a export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib' ~/TestBash.txt #~/.bashrc fi if [ ! -n "$catalinahome" ]; then sed -i '$a export CATALINA_HOME='$(pwd) ~/TestBash.txt #~/.bashrc else sed -i 's:'${catalinahome//\\/\\\\}':export CATALINA_HOME='$(pwd)':g' ~/TestBash.txt fi if [ ! -n "$tomcathome" ]; then sed -i '$a export TOMCAT_HOME='$(pwd) ~/TestBash.txt #~/.bashrc else sed -i 's:'${tomcathome//\\/\\\\}':export TOMCAT_HOME='$(pwd)':g' ~/TestBash.txt fi if [ ! -n "$catalinabase" ]; then sed -i '$a export CATALINA_BASE='$(pwd) ~/TestBash.txt #~/.bashrc else sed -i 's:'${catalinabase//\\/\\\\}':export CATALINA_BASE='$(pwd)':g' ~/TestBash.txt fi if [ ! -n "$jbosshome" ]; then sed -i '$a export JBOSS_HOME='$(pwd) ~/TestBash.txt #~/.bashrc else sed -i 's:'${jbosshome//\\/\\\\}':export JBOSS_HOME='$(pwd)':g' ~/TestBash.txt fi if [ ! -n "$jbosspath" ]; then sed -i '$a export PATH=$PATH:$CATALINA_HOME/bin' ~/TestBash.txt #~/.bashrc fi IFS=$OLDIFS 53.批量转换编码从Unicode到GB2312 #!/bin/bash scode="ucs2" dcode="gbk" for FILE in $(find $(pwd) -type f) do TMP_file=$(mktemp -p $(pwd)) if [ -f $FILE ]; then Fright=$(stat -c %a $FILE) Fuser=$(stat -c %U $FILE) Fgrp=$(stat -c %G $FILE) iconv -f $scode -t $dcode $FILE -o $TMP_file mv $TMP_file $FILE chmod $Fright $FILE chown $Fuser.$Fgrp $FILE fi done 54.删除空文件夹 #!/bin/bash rmdir -p %%1 55.GB2312文件转UTF-8格式 #!/bin/bash iconv -f gbk -t utf8 %%1 -o %%2 56.UTF-8文件转GB2312格式 #!/bin/bash iconv -f utf8 -t gbk %%1 -o %%2 57.获取文件路径的父路径 #!/bin/bash %%1=basename $PWD 58.Unicode文件转UTF-8格式 #!/bin/bash iconv -f ucs2 -t utf-8 %%1 -o %%2 59.CRC循环冗余校验 #!/bin/bash cat <<'EOF'> crc.c #include<stdio.h> unsigned long int crc32_table[256]; unsigned long int ulPolynomial = 0x04c11db7; unsigned long int Reflect(unsigned long int ref, char ch) { unsigned long int value(0); // 交换bit0和bit7,bit1和bit6,类推 for(int i = 1; i < (ch + 1); i++) { if(ref & 1) value |= 1 << (ch - i); ref >>= 1; } return value; } init_crc32_table() { unsigned long int crc,temp; // 256个值 for(int i = 0; i <= 0xFF; i++) { temp=Reflect(i, 8); crc32_table[i]= temp<< 24; for (int j = 0; j < 8; j++){ unsigned long int t1,t2; unsigned long int flag=crc32_table[i]&0x80000000; t1=(crc32_table[i] << 1); if(flag==0) t2=0; else t2=ulPolynomial; crc32_table[i] =t1^t2 ; } crc=crc32_table[i]; crc32_table[i] = Reflect(crc32_table[i], 32); } } unsigned long GenerateCRC32(char xdata * DataBuf,unsigned long len) { unsigned long oldcrc32; unsigned long crc32; unsigned long oldcrc; unsigned int charcnt; char c,t; oldcrc32 = 0x00000000; //初值为0 charcnt=0; while (len--) { t= (oldcrc32 >> 24) & 0xFF; //要移出的字节的值 oldcrc=crc_32_tab[t]; //根据移出的字节的值查表 c=DataBuf[charcnt]; //新移进来的字节值 oldcrc32= (oldcrc32 << 8) | c; //将新移进来的字节值添在寄存器末字节中 oldcrc32=oldcrc32^oldcrc; //将寄存器与查出的值进行xor运算 charcnt++; } crc32=oldcrc32; return crc32; } 参数表可以先在PC机上算出来,也可在程序初始化时完成。下面是用于计算参数表的c语言子程序,在Visual C++ 6.0下编译通过。 #include <stdio.h> unsigned long int crc32_table[256]; unsigned long int ulPolynomial = 0x04c11db7; unsigned long int Reflect(unsigned long int ref, char ch) { unsigned long int value(0); // 交换bit0和bit7,bit1和bit6,类推 for(int i = 1; i < (ch + 1); i++) { if(ref & 1) value |= 1 << (ch - i); ref >>= 1; } return value; } int main() { unsigned long int crc,temp; // 256个值 for(int i = 0; i <= 0xFF; i++) { temp=Reflect(i, 8); crc32_table[i]= temp<< 24; for (int j = 0; j < 8; j++){ unsigned long int t1,t2; unsigned long int flag=crc32_table[i]&0x80000000; t1=(crc32_table[i] << 1); if(flag==0) t2=0; else t2=ulPolynomial; crc32_table[i] =t1^t2 ; } crc=crc32_table[i]; crc32_table[i] = Reflect(crc32_table[i], 32); } return 0; } EOF gcc -o crc crc.c if [ $? -eq 0 ]; then ./combine else echo 'Compile ERROR' fi 60.判断是否为空文件 #!/bin/bash 61.终止程序 #!/bin/sh kill -KILL pidof %%1 -s #killall %%1 62.定时关机 #!/bin/sh shutdown -h %%1 & #23:00 #shutdown -h now #halt #/sbin/poweroff #init 0 63.显示进程列表 #!/bin/sh ps aux #fuser -l 64.遍历文件夹列出文件大小 #!/bin/sh du -sH "%%1/*" 65.GOST算法 #!/bin/bash 66.对目标压缩文件解压缩到指定文件夹 #!/bin/bash 67.保存文件时重名自动生成新文件 #!/bin/bash 68.打开网页 #!/bin/sh lynx %%1 69.删除空文件夹整合操作 #!/bin/bash 70.获取磁盘所有分区 #!/bin/sh df -k 71.激活一个程序或程序关联的文件 #!/bin/bash 72.MP3播放 #!/bin/sh amp "%%1" 73.WAV播放 #!/bin/sh amp "%%1" 74.写图像到剪切板 #!/bin/bash 75.从剪贴板复制图像到窗体 #!/bin/bash 76.删除文件夹下的所有文件且不删除文件夹下的文件夹 #!/bin/sh rm -if "%%1/*" 77.XML遍历结点属性值 #!/bin/bash 78.Unicode文件转GB2312格式 #!/bin/sh iconv -f ucs2 -t gbk %%1 -o %%2 79.开源程序库Xercesc-C++代码工程中内联80.提取包含头文件列表 #!/bin/bash 81.GB2312文件转Unicode格式 #!/bin/sh iconv -f gbk -t ucs2 %%1 -o %%2 82.Java程序打包 #!/bin/bash 83.UTF-8文件转Unicode格式 #!/bin/bash iconv -f utf8 -t ucs2 %%1 -o %%2</pre> <p> </p> </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1177302394757771264"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(shell,文件操作,命令,linux)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1946962191143989248.htm" title="ec2-user 1234 0.1 0.2 123456 7890 pts/0 S+ 12:34 0:00 java -jar my-java-service.jar" target="_blank">ec2-user 1234 0.1 0.2 123456 7890 pts/0 S+ 12:34 0:00 java -jar my-java-service.jar</a> <span class="text-muted">HainesFreeman</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/jar/1.htm">jar</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>ec2-user12340.10.21234567890pts/0S+12:340:00java-jarmy-java-service.jar这里的1234,123456,7890分别代表什么?psaux|grepjava在Linux系统中,psaux命令的输出包含多个字段,每个字段都有特定的含义。以下是对psaux输出中常见字段的解释,特别是你提到的1234、123456和7890这三个数字的含</div> </li> <li><a href="/article/1946958786837147648.htm" title="Linux中Centos和Ubuntu的区别是什么?" target="_blank">Linux中Centos和Ubuntu的区别是什么?</a> <span class="text-muted">老男孩IT教育</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/centos/1.htm">centos</a><a class="tag" taget="_blank" href="/search/ubuntu/1.htm">ubuntu</a> <div>Linux是一种免费使用和自由传播的类UNIX操作系统,拥有众多发行版本,其中最受欢迎的就是Centos和Ubuntu,各自具有独特的特点和优势,那么Linux中Centos和Ubuntu的区别是什么?具体请看下文。CentOS和Ubuntu都是流行的Linux发行版,但它们在用途和目标用户方面存在一些关键差异。起源和目标CentOS是RedHatEnterpriseLinux的一个免费和开源版本</div> </li> <li><a href="/article/1946952690370146304.htm" title="Binder跨进程通信机制" target="_blank">Binder跨进程通信机制</a> <span class="text-muted">四喜汤圆</span> <div>一、相关概念进程空间把进程空间分为用户空间和内核空间。进程间:用户空间不可共享,内核空间可以共享,所有进程共用一个内核空间。用户空间和内核空间的交互通过系统调用。copy_from_user:将数据从用户空间拷贝到内核空间copy_to_user:将数据从内核空间拷贝到用户空间进程隔离在Linux中,虚拟内存机制为每个进程分配了线性连续的内存空间,OS将这种虚拟内存空间映射到物理内存空间。-->每</div> </li> <li><a href="/article/1946951342987735040.htm" title="Python SSTI漏洞原理与基础利用以及Fenjing的使用教程" target="_blank">Python SSTI漏洞原理与基础利用以及Fenjing的使用教程</a> <span class="text-muted">cba尼里托圣</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a><a class="tag" taget="_blank" href="/search/web%E5%AE%89%E5%85%A8/1.htm">web安全</a> <div>文章目录一、Python类与对象模型基础二、魔术方法的作用与利用价值1.__class__魔术方法2.__bases__与__mro__魔术方法3.__subclasses__()魔术方法4.__init__魔术方法5.__globals__魔术方法三、魔术方法链的构建与利用1.漏洞验证2.获取类对象3.定位到object基类4.遍历object的子类5.定位危险类6.获取全局变量空间7.执行命令</div> </li> <li><a href="/article/1946945669608566784.htm" title="#Linux内存管理# 假设使用printf打印指针bufA和bufB指向的地址是一样的,那么在内核中这两块虚拟内存是否“打架”了呢?" target="_blank">#Linux内存管理# 假设使用printf打印指针bufA和bufB指向的地址是一样的,那么在内核中这两块虚拟内存是否“打架”了呢?</a> <span class="text-muted"></span> <div>不,在内核中这两块虚拟内存不会“打架”。原因在于虚拟内存的工作原理和内核的管理机制。下面我将详细解释,基于你描述的场景:假设在同一个进程或不同进程中,使用printf打印出的bufA和bufB的虚拟地址值相同。关键点:虚拟地址是进程本地的用户空间虚拟地址的含义:printf打印的地址是用户空间的虚拟地址(VirtualAddress)。每个进程都有自己的虚拟地址空间,由操作系统内核通过内存管理单元</div> </li> <li><a href="/article/1946945670090911744.htm" title="#Linux内存管理# vm_normal_page()函数返回的什么样页面的struct page数据结构?为什么内存管理代码中需要这个函数?" target="_blank">#Linux内存管理# vm_normal_page()函数返回的什么样页面的struct page数据结构?为什么内存管理代码中需要这个函数?</a> <span class="text-muted"></span> <div>vm_normal_page()函数是Linux内核内存管理的一个关键且微妙的函数,其职责和返回结果需要深入理解。下面详细解释:1.vm_normal_page()返回什么样的structpage?vm_normal_page()函数接收一个有效的、已经存在于物理内存中的页表项(PTE)作为输入(即pte_present(pte)必须为true),然后返回一个指向与该PTE所映射的物理页帧相对应的</div> </li> <li><a href="/article/1946942515651342336.htm" title="Python 中 sys 库的全面解析与实战应用" target="_blank">Python 中 sys 库的全面解析与实战应用</a> <span class="text-muted">二向箔reverse</span> <a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>在Python的众多标准库中,sys库占据着举足轻重的地位。它与Python解释器紧密交互,为开发者提供了访问解释器内部信息和控制解释器行为的强大能力。无论是命令行参数处理、系统环境配置,还是程序退出控制,sys库都能大显身手。本文将带您深入探索sys库的常用功能,通过丰富的实例讲解,助您轻松掌握其使用技巧。sys库的基础认知sys库是Python的内置标准库,无需额外安装,只需通过imports</div> </li> <li><a href="/article/1946937219361075200.htm" title="KVM中使用桥接模式.运维就业技术教程" target="_blank">KVM中使用桥接模式.运维就业技术教程</a> <span class="text-muted"></span> <div>在KVM中使用桥接模式可以让虚拟机直接接入物理网络,使其成为局域网中的独立节点。以下是配置和使用桥接模式的详细指南:一、桥接模式原理作用:虚拟机通过宿主机的网桥(如virbr0)直接与物理交换机/路由器通信,获得与宿主机相同的网段IP。特点:虚拟机拥有独立IP,可被局域网内其他设备直接访问。无需NAT转换,网络性能更高。需确保宿主机网桥已正确配置。二、配置步骤1.创建网桥接口大多数Linux发行版</div> </li> <li><a href="/article/1946934697980391424.htm" title="掌握C#文件操作与XML处理:学习资料完整指南" target="_blank">掌握C#文件操作与XML处理:学习资料完整指南</a> <span class="text-muted">竹石文化传播有限公司</span> <div>本文还有配套的精品资源,点击获取简介:C#是一种广泛应用于Windows和跨平台开发的编程语言,它在.NET框架中包含强大的文件和XML操作能力。本文深入探讨了C#中的文件读写技术,包括使用System.IO命名空间中的File类进行文本和二进制文件处理,FileStream类的流操作,以及XML文档的解析、创建和修改方法。同时,文章也介绍了文件操作的扩展功能和在进行文件操作时应考虑的异常处理。通</div> </li> <li><a href="/article/1946932933252149248.htm" title="用bash-completion 实现pman自动补全" target="_blank">用bash-completion 实现pman自动补全</a> <span class="text-muted"></span> <div>前言每次查php函数的用法,都要查看手册,感觉好麻烦,于是决心在自己的命令行里实现pman自动补全提示:以下是本篇文章正文内容,下面案例可供参考一、安装先安装pear命令。不是本文重点,请自行查阅Manual::Installation(PEAR)执行命令pearinstalldoc.php.net/pman二、直接使用代码如下(示例):pmangettype结果如下三、按装bash-comple</div> </li> <li><a href="/article/1946932554691047424.htm" title="CentOS Bash 命令补全增强软件包 bash-completion" target="_blank">CentOS Bash 命令补全增强软件包 bash-completion</a> <span class="text-muted">weixin_30790841</span> <a class="tag" taget="_blank" href="/search/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/1.htm">操作系统</a><a class="tag" taget="_blank" href="/search/shell/1.htm">shell</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a> <div>之前安装的CentOS7是最小化安装,在使用systemctl命令进行服务的管理时,经常手动输入相关服务名。如果对一个服务名称不熟悉,这样可以迫使我们记住它,但如果对一个服务名已经很熟悉了,再手动输入就比较浪费时间了。这时我们可以安装使用Bash命令补全增强软件包bash-completion,这个包支持对systemctl命令服务名称的补全。bash-completion简介及安装使用在RHEL</div> </li> <li><a href="/article/1946924995871567872.htm" title="rce漏洞测试" target="_blank">rce漏洞测试</a> <span class="text-muted"></span> <div>目录什么是RCE?漏洞介绍漏洞分类远程命令执行29关30关31关32~36关37关38关39关40关41关42关43关44关45关46~49关总结什么是RCE?漏洞介绍RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。RCE主要指远程代码执行和远程命令执行,CTFHub中将文件包含漏洞也看作RCE漏洞。漏洞分类远程命令执行远程代码执行文件包含漏洞实际上,RCE</div> </li> <li><a href="/article/1946923229587238912.htm" title="PostgreSQL常用命令与工具指南" target="_blank">PostgreSQL常用命令与工具指南</a> <span class="text-muted">Mr.小海</span> <a class="tag" taget="_blank" href="/search/Linux/1.htm">Linux</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/postgresql/1.htm">postgresql</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE/1.htm">网络协议</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4%E5%BC%80%E5%8F%91/1.htm">运维开发</a> <div>文章目录PostgreSQL常用命令与工具指南简介1.连接与基本操作连接数据库环境变量设置(避免密码输入)常用元命令2.数据库与表管理数据库操作创建数据库删除数据库修改数据库属性表操作创建表修改表结构删除表索引管理创建索引删除索引3.数据操作(CRUD)插入数据查询数据更新数据删除数据事务控制4.账号与权限管理角色/用户操作创建角色修改角色删除角色权限控制授予权限撤销权限查看权限5.常用函数字符串</div> </li> <li><a href="/article/1946917416277700608.htm" title="bash-completion未安装或未启用" target="_blank">bash-completion未安装或未启用</a> <span class="text-muted">teayear</span> <a class="tag" taget="_blank" href="/search/bash/1.htm">bash</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>在Linux系统中,按下Tab键无法触发自动补全或提示的情况,通常是由以下原因导致的。以下是具体分析和解决方案:一、常见原因及解决方案1.bash-completion未安装或未启用原因:bash-completion是提供命令补全功能的核心工具,部分Linux发行版(如CentOS)默认未安装此工具。解决方案:#安装bash-completionsudoyuminstall-ybash-comp</div> </li> <li><a href="/article/1946910863730470912.htm" title="Linux 命令:uname" target="_blank">Linux 命令:uname</a> <span class="text-muted">hweiyu00</span> <a class="tag" taget="_blank" href="/search/Linux%E5%91%BD%E4%BB%A4/1.htm">Linux命令</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a> <div>Linuxuname命令详细教程uname(UnixName)是Linux系统中用于获取系统基本信息的基础命令。它能快速展示操作系统、内核、主机名等关键信息,是系统诊断和环境确认的常用工具。资料已经分类整理好:https://pan.quark.cn/s/26d73f7dd8a7一、基本语法uname[选项]核心功能:默认只显示操作系统名称(如Linux)。通过选项可获取更详细的系统信息。二、常用</div> </li> <li><a href="/article/1946899768953335808.htm" title="Linux进程间通信--命名管道" target="_blank">Linux进程间通信--命名管道</a> <span class="text-muted"></span> <div>目录1、什么是命名管道1.1命名管道的创建和使用1.2、命名管道的工作原理1.3、命名管道与匿名管道的区别2.命名管道的特点及特殊场景2.1特点2.2四种特殊场景3.日志类的模拟3.1可变参数的利用3.2time()函数和structtm类的介绍3.3日期类的实现1、什么是命名管道命名管道是一种在文件系统中存在的特殊文件类型,它允许不同进程通过文件名(即“命名”)来访问和进行通信。与匿名管道相比,</div> </li> <li><a href="/article/1946895864970670080.htm" title="个人笔记(linux/sort与uniq命令)" target="_blank">个人笔记(linux/sort与uniq命令)</a> <span class="text-muted"></span> <div>sort命令(排序)功能:行排序核心语法:sort[选项][文件]常用选项:选项作用示例-n数值排序sort-n-r降序排序sort-nr-k指定排序列sort-k2,2n-t指定分隔符sort-t':'-k3n-u去重(相当于uniq)sort-u典型用法:#按第二列数字降序排序sort-k2,2nrdata.txt#处理CSV文件(以逗号分隔)sort-t','-k3ndata.csv注意事项</div> </li> <li><a href="/article/1946888172839432192.htm" title="windows下jar包配置为开机自启动" target="_blank">windows下jar包配置为开机自启动</a> <span class="text-muted"></span> <div>在jar包目录新建一个start.bat文件,然后写入启动命令java-jarX.jar2.仍然在此目录,新建start.vbs文件,然后写入一下命令,命令最后一个0是隐藏窗口运行createobject("wscript.shell").run"D:\start.bat",03.创建run.vbs的快捷方式,移动到开机自启动目录下:C:\ProgramData\Microsoft\Windows</div> </li> <li><a href="/article/1946888123904487424.htm" title="inotify-tools监控文件的变动情况" target="_blank">inotify-tools监控文件的变动情况</a> <span class="text-muted">Tim在路上</span> <div>在实际的生产中,都会存在不同系统的对接问题,比如A系统将数据生产后存放到/data文件下,B系统需要监控/data文件夹下数据的变动情况,来做出调整,linux系统中inotify-tools正好可以完成系统的监控而supervise正好可以完成进程的持续监控,起到出错重启的效果。inotify-toolsinotify-tools下载地址:http://github.com/downloads/</div> </li> <li><a href="/article/1946887668491153408.htm" title="mac配置svn" target="_blank">mac配置svn</a> <span class="text-muted">qianmu0322</span> <a class="tag" taget="_blank" href="/search/macos/1.htm">macos</a><a class="tag" taget="_blank" href="/search/svn/1.htm">svn</a><a class="tag" taget="_blank" href="/search/xcode/1.htm">xcode</a> <div>一、苹果上没有小乌龟客户端,可用snailSVN精简版本,免费,基本功能都有二、mac上下载了一个破解版本的2022的idea,却没有svn的命令行工具,在windows上安装小乌龟的时候勾选上就能关联了,mac上需自行安装1、安装Xcode命令行工具Xcode是macOS的集成开发环境,它包含Homebrew正常运行所需的工具。注意:Xcode通常是安装和使用各种工具的先决条件,例如PuTTY,</div> </li> <li><a href="/article/1946886030460252160.htm" title="通过 Ollama 获取并运行本地大型语言模型(LLM)" target="_blank">通过 Ollama 获取并运行本地大型语言模型(LLM)</a> <span class="text-muted"></span> <div>Ollama是一个开源工具,专为在本地机器上便捷部署和运行大型语言模型(LLM)而设计。它支持多种操作系统(Windows、macOS、Linux),并提供简单的命令行接口和API,适合开发者、研究人员以及对数据隐私有较高要求的用户。本文档将详细指导您如何通过Ollama在本地获取和运行LLM。1.准备工作在开始之前,请确保您的系统满足以下要求:操作系统:Windows、macOS或Linux(支</div> </li> <li><a href="/article/1946883130057093120.htm" title="Windows后台运行jar包" target="_blank">Windows后台运行jar包</a> <span class="text-muted">BillKu</span> <a class="tag" taget="_blank" href="/search/windows/1.htm">windows</a><a class="tag" taget="_blank" href="/search/jar/1.htm">jar</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>在Windows系统中,可以通过以下几种方法让JAR文件在后台静默运行:方法1:使用javaw命令javaw是Java的无控制台版本,不会显示命令行窗口。直接运行命令:cmd复制下载javaw-jaryour-app.jar进程会在后台运行,但关闭当前命令提示符窗口时进程可能会终止(取决于启动方式)。持久化后台运行(推荐):新建一个批处理文件(如run.bat),内容如下:bat复制下载@echo</div> </li> <li><a href="/article/1946879483973791744.htm" title="dos命令driverquery图文教程,显示系统已安装设备驱动程序批处理" target="_blank">dos命令driverquery图文教程,显示系统已安装设备驱动程序批处理</a> <span class="text-muted">老盖聊技术</span> <div>大家好,我是老盖,首先感谢观看本文,本篇文章做的有视频,视频讲述的比较详细,也可以看我发布的视频。今天我们学习dos中driverquery这个命令,输入命令driverquery/?可以查看这个命令的介绍和一些参数,它这个命令就是查看系统已经安装的驱动程序。直接输入命令driverquery,以看到本机已经安装的驱动程序,可以看到模块名,显示名字,驱动程序类型和链接日期。我们也可以通过图形化界面</div> </li> <li><a href="/article/1946875414513250304.htm" title="软件测试理论基础、质量保证常见面试题" target="_blank">软件测试理论基础、质量保证常见面试题</a> <span class="text-muted">程序员阿沐</span> <div>全面掌握软件测试理论基础、文档编写,测试流程1.测试分为哪几个阶段?⒉谈谈你之前测试的项目流程,在每个阶段的输出有哪些?3.谈谈敏捷模式的认识?4.linux常见查看日志命令有哪些?5.线上质量BUG频频爆发怎么办?6.如何分析一个bug是前端还是后端的问题?这些问题你一定要能够很全面的表述出来。比如说我现在是面试官,我第一个肯定不会去问你哪些代码的问题,也不会问你自动化、测试开发的问题。第一个查</div> </li> <li><a href="/article/1946875321856880640.htm" title="Android7以上的手机通过fiddler抓包" target="_blank">Android7以上的手机通过fiddler抓包</a> <span class="text-muted">春暖花开จุ๊บL</span> <a class="tag" taget="_blank" href="/search/fiddler/1.htm">fiddler</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7/1.htm">测试工具</a> <div>设置以及安装步骤0,要求手机要先root1,安装fiddler,不赘述。不熟悉的可以安装中文版。fiddler中文版下载地址,并且把fiddler的证书文件导出到桌面上。2,安装windows版本的openssl。下载地址:OpenSSL下载地址记录好安装路径。3,到openssl的安装路径\bin目录下。shift+右键运行命令行。把fiddler的证书文件剪切到bin目录下。命令行执行open</div> </li> <li><a href="/article/1946873935983341568.htm" title="python ffmpeg pipe_如何使用python从ffmpeg输出管道?" target="_blank">python ffmpeg pipe_如何使用python从ffmpeg输出管道?</a> <span class="text-muted">weixin_39611725</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/ffmpeg/1.htm">ffmpeg</a><a class="tag" taget="_blank" href="/search/pipe/1.htm">pipe</a> <div>我正在尝试将FFmpeg的输出用管道输送到Python中。我正在从一个视频采集卡读取图像,我成功地使用dshow从命令行将其读入输出文件。我正在尝试从卡抓取图像到我的OpenCv代码,以便能够进一步处理数据。不幸的是,当我通过管道输出图像时,我只得到视频的显示,如链接所示:link:s000.tinyupload.com/?file_id=15940665795196022618.我使用的代码如下</div> </li> <li><a href="/article/1946873555736129536.htm" title="Linux+Python实战课堂:笔记、练习与应用" target="_blank">Linux+Python实战课堂:笔记、练习与应用</a> <span class="text-muted"></span> <div>本文还有配套的精品资源,点击获取简介:本压缩包提供全面的Linux学习资源和Python编程练习,旨在帮助初学者和IT从业者深入理解Linux系统及其技能,并通过Python编程练习巩固相关技能。涵盖Linux基础概念、文件系统、命令行操作、文本编辑器使用、用户和组管理、软件管理、进程监控、网络配置以及系统性能监控等多个方面。同时,包含Python基础语法、函数与模块、面向对象编程、文件操作、异常</div> </li> <li><a href="/article/1946871918053355520.htm" title="Redis 如何保证高并发与高可用" target="_blank">Redis 如何保证高并发与高可用</a> <span class="text-muted">笑衬人心。</span> <a class="tag" taget="_blank" href="/search/Redis%E7%AC%94%E8%AE%B0/1.htm">Redis笔记</a><a class="tag" taget="_blank" href="/search/redis/1.htm">redis</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/%E7%BC%93%E5%AD%98/1.htm">缓存</a> <div>一、Redis高并发的实现机制1.1单线程模型+I/O多路复用Redis使用单线程架构(从Redis6开始引入I/O多线程,但核心命令仍由单线程执行)。采用epoll/kqueue等I/O多路复用机制,非阻塞处理大量连接。避免多线程带来的上下文切换和锁竞争问题。1.2高效数据结构与命令执行内部使用如跳表、字典、压缩列表、整数集合、位图等高效结构。Redis命令执行在内存中,时间复杂度较低(多数为O</div> </li> <li><a href="/article/1946871414229364736.htm" title="【立创泰山派】Linux驱动之UART驱动程序" target="_blank">【立创泰山派】Linux驱动之UART驱动程序</a> <span class="text-muted">Monisa_sama</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E5%8D%95%E7%89%87%E6%9C%BA/1.htm">单片机</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a> <div>Linux串口驱动前言1.串口通信2.调试和测试3.性能分析4.扩展串口功能一、基础知识1.什么是串口1.1波特率2.通信协议2.1UART帧结构2.2校验方式二、硬件接口1.基于TTL的UART通讯2.基于RS232的UART通讯3.基于RS485的UART通讯三、软件框架1.驱动子系统框架1.1串口驱动程序位置1.2使用8250驱动的方式1.3串口设备的调试方法2.注册流程分析3.设备树配置3</div> </li> <li><a href="/article/1946860826069626880.htm" title="buildroot+qemu+arm64虚拟环境多种方式启动linux内核" target="_blank">buildroot+qemu+arm64虚拟环境多种方式启动linux内核</a> <span class="text-muted">左家垅的牛</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a> <div>Qemu:QEMU是一款开源的硬件虚拟化软件,可以在不同的主机平台上运行虚拟机。它通过动态的二进制转换,模拟CPU,并且提供一组设备模型,使它能够运行多种未修改的客户机OS。QEMU采用全系统仿真,可以模拟完整的计算机系统,包括处理器、内存、存储和外围设备。它提供硬件仿真,允许在一个虚拟环境中运行不同体系结构的操作系统和应用程序。QEMU可以与KVM一起使用,进而接近本地速度运行虚拟机。目前,QE</div> </li> <li><a href="/article/123.htm" title="js动画html标签(持续更新中)" target="_blank">js动画html标签(持续更新中)</a> <span class="text-muted">843977358</span> <a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/js/1.htm">js</a><a class="tag" taget="_blank" href="/search/%E5%8A%A8%E7%94%BB/1.htm">动画</a><a class="tag" taget="_blank" href="/search/media/1.htm">media</a><a class="tag" taget="_blank" href="/search/opacity/1.htm">opacity</a> <div>1.jQuery 效果 - animate() 方法    改变 "div" 元素的高度:    $(".btn1").click(function(){      $("#box").animate({height:"300px</div> </li> <li><a href="/article/250.htm" title="springMVC学习笔记" target="_blank">springMVC学习笔记</a> <span class="text-muted">caoyong</span> <a class="tag" taget="_blank" href="/search/springMVC/1.htm">springMVC</a> <div>1、搭建开发环境    a>、添加jar文件,在ioc所需jar包的基础上添加spring-web.jar,spring-webmvc.jar    b>、在web.xml中配置前端控制器       <servlet>     &nbs</div> </li> <li><a href="/article/377.htm" title="POI中设置Excel单元格格式" target="_blank">POI中设置Excel单元格格式</a> <span class="text-muted">107x</span> <a class="tag" taget="_blank" href="/search/poi/1.htm">poi</a><a class="tag" taget="_blank" href="/search/style/1.htm">style</a><a class="tag" taget="_blank" href="/search/%E5%88%97%E5%AE%BD/1.htm">列宽</a><a class="tag" taget="_blank" href="/search/%E5%90%88%E5%B9%B6%E5%8D%95%E5%85%83%E6%A0%BC/1.htm">合并单元格</a><a class="tag" taget="_blank" href="/search/%E8%87%AA%E5%8A%A8%E6%8D%A2%E8%A1%8C/1.htm">自动换行</a> <div>引用:http://apps.hi.baidu.com/share/detail/17249059 POI中可能会用到一些需要设置EXCEL单元格格式的操作小结: 先获取工作薄对象: HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet = wb.createSheet(); HSSFCellStyle setBorder = wb.</div> </li> <li><a href="/article/504.htm" title="jquery 获取A href 触发js方法的this参数 无效的情况" target="_blank">jquery 获取A href 触发js方法的this参数 无效的情况</a> <span class="text-muted">一炮送你回车库</span> <a class="tag" taget="_blank" href="/search/jquery/1.htm">jquery</a> <div>html如下:  <td class=\"bord-r-n bord-l-n c-333\"> <a class=\"table-icon edit\" onclick=\"editTrValues(this);\">修改</a> </td>"   j</div> </li> <li><a href="/article/631.htm" title="md5" target="_blank">md5</a> <span class="text-muted">3213213333332132</span> <a class="tag" taget="_blank" href="/search/MD5/1.htm">MD5</a> <div> import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class MDFive { public static void main(String[] args) { String md5Str = "cq</div> </li> <li><a href="/article/758.htm" title="完全卸载干净Oracle11g" target="_blank">完全卸载干净Oracle11g</a> <span class="text-muted">sophia天雪</span> <a class="tag" taget="_blank" href="/search/orale%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">orale数据库</a><a class="tag" taget="_blank" href="/search/%E5%8D%B8%E8%BD%BD%E5%B9%B2%E5%87%80/1.htm">卸载干净</a><a class="tag" taget="_blank" href="/search/%E6%B8%85%E7%90%86%E6%B3%A8%E5%86%8C%E8%A1%A8/1.htm">清理注册表</a> <div>完全卸载干净Oracle11g A、存在OUI卸载工具的情况下:     第一步:停用所有Oracle相关的已启动的服务;     第二步:找到OUI卸载工具:在“开始”菜单中找到“oracle_OraDb11g_home”文件夹中         &</div> </li> <li><a href="/article/885.htm" title="apache 的access.log 日志文件太大如何解决" target="_blank">apache 的access.log 日志文件太大如何解决</a> <span class="text-muted">darkranger</span> <a class="tag" taget="_blank" href="/search/apache/1.htm">apache</a> <div>CustomLog logs/access.log common  此写法导致日志数据一致自增变大。 直接注释上面的语法 #CustomLog logs/access.log common 增加: CustomLog "|bin/rotatelogs.exe -l logs/access-%Y-%m-d.log </div> </li> <li><a href="/article/1012.htm" title="Hadoop单机模式环境搭建关键步骤" target="_blank">Hadoop单机模式环境搭建关键步骤</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a> <div>        Hadoop环境需要sshd服务一直开启,故,在服务器上需要按照ssh服务,以Ubuntu Linux为例,按照ssh服务如下: sudo apt-get install ssh sudo apt-get install rsync 编辑HADOOP_HOME/conf/hadoop-env.sh文件,将JAVA_HOME设置为Java</div> </li> <li><a href="/article/1139.htm" title="PL/SQL DEVELOPER 使用的一些技巧" target="_blank">PL/SQL DEVELOPER 使用的一些技巧</a> <span class="text-muted">atongyeye</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a> <div>1 记住密码 这是个有争议的功能,因为记住密码会给带来数据安全的问题。 但假如是开发用的库,密码甚至可以和用户名相同,每次输入密码实在没什么意义,可以考虑让PLSQL Developer记住密码。 位置:Tools菜单--Preferences--Oracle--Logon HIstory--Store with password 2 特殊Copy 在SQL Window</div> </li> <li><a href="/article/1266.htm" title="PHP:在对象上动态添加一个新的方法" target="_blank">PHP:在对象上动态添加一个新的方法</a> <span class="text-muted">bardo</span> <a class="tag" taget="_blank" href="/search/%E6%96%B9%E6%B3%95/1.htm">方法</a><a class="tag" taget="_blank" href="/search/%E5%8A%A8%E6%80%81%E6%B7%BB%E5%8A%A0/1.htm">动态添加</a><a class="tag" taget="_blank" href="/search/%E9%97%AD%E5%8C%85/1.htm">闭包</a> <div>有关在一个对象上动态添加方法,如果你来自Ruby语言或您熟悉这门语言,你已经知道它是什么...... Ruby提供给你一种方式来获得一个instancied对象,并给这个对象添加一个额外的方法。   好!不说Ruby了,让我们来谈谈PHP   PHP未提供一个“标准的方式”做这样的事情,这也是没有核心的一部分...   但无论如何,它并没有说我们不能做这样</div> </li> <li><a href="/article/1393.htm" title="ThreadLocal与线程安全" target="_blank">ThreadLocal与线程安全</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/java%E5%A4%9A%E7%BA%BF%E7%A8%8B/1.htm">java多线程</a><a class="tag" taget="_blank" href="/search/threadLocal/1.htm">threadLocal</a> <div>首先来看一下线程安全问题产生的两个前提条件:  1.数据共享,多个线程访问同样的数据。  2.共享数据是可变的,多个线程对访问的共享数据作出了修改。    实例:         定义一个共享数据: public static int a = 0;         </div> </li> <li><a href="/article/1520.htm" title="Tomcat 架包冲突解决" target="_blank">Tomcat 架包冲突解决</a> <span class="text-muted">征客丶</span> <a class="tag" taget="_blank" href="/search/tomcat/1.htm">tomcat</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a> <div>环境: Tomcat 7.0.6 win7 x64 错误表象:【我的冲突的架包是:catalina.jar 与 tomcat-catalina-7.0.61.jar 冲突,不知道其他架包冲突时是不是也报这个错误】 严重: End event threw exception java.lang.NoSuchMethodException: org.apache.catalina.dep</div> </li> <li><a href="/article/1647.htm" title="【Scala三】分析Spark源代码总结的Scala语法一" target="_blank">【Scala三】分析Spark源代码总结的Scala语法一</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/scala/1.htm">scala</a> <div>Scala语法 1. classOf运算符 Scala中的classOf[T]是一个class对象,等价于Java的T.class,比如classOf[TextInputFormat]等价于TextInputFormat.class    2. 方法默认值 defaultMinPartitions就是一个默认值,类似C++的方法默认值     </div> </li> <li><a href="/article/1774.htm" title="java 线程池管理机制" target="_blank">java 线程池管理机制</a> <span class="text-muted">BlueSkator</span> <a class="tag" taget="_blank" href="/search/java%E7%BA%BF%E7%A8%8B%E6%B1%A0/1.htm">java线程池</a><a class="tag" taget="_blank" href="/search/%E7%AE%A1%E7%90%86%E6%9C%BA%E5%88%B6/1.htm">管理机制</a> <div>编辑 Add Tools   jdk线程池   一、引言 第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。   </div> </li> <li><a href="/article/1901.htm" title="关于hql中使用本地sql函数的问题(问-答)" target="_blank">关于hql中使用本地sql函数的问题(问-答)</a> <span class="text-muted">BreakingBad</span> <a class="tag" taget="_blank" href="/search/HQL/1.htm">HQL</a><a class="tag" taget="_blank" href="/search/%E5%AD%98%E5%82%A8%E5%87%BD%E6%95%B0/1.htm">存储函数</a> <div>转自于:http://www.iteye.com/problems/23775 问: 我在开发过程中,使用hql进行查询(mysql5)使用到了mysql自带的函数find_in_set()这个函数作为匹配字符串的来讲效率非常好,但是我直接把它写在hql语句里面(from ForumMemberInfo fm,ForumArea fa where find_in_set(fm.userId,f</div> </li> <li><a href="/article/2028.htm" title="读《研磨设计模式》-代码笔记-迭代器模式-Iterator" target="_blank">读《研磨设计模式》-代码笔记-迭代器模式-Iterator</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a> <div>声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/ import java.util.Arrays; import java.util.List; /** * Iterator模式提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象内部表示 * * 个人觉得,为了不暴露该</div> </li> <li><a href="/article/2155.htm" title="常用SQL" target="_blank">常用SQL</a> <span class="text-muted">chenjunt3</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/C%2B%2B/1.htm">C++</a><a class="tag" taget="_blank" href="/search/c/1.htm">c</a><a class="tag" taget="_blank" href="/search/C%23/1.htm">C#</a> <div> --NC建库 CREATE TABLESPACE NNC_DATA01 DATAFILE 'E:\oracle\product\10.2.0\oradata\orcl\nnc_data01.dbf' SIZE 500M AUTOEXTEND ON NEXT 50M EXTENT MANAGEMENT LOCAL UNIFORM SIZE 256K ; CREATE TABLESPA</div> </li> <li><a href="/article/2282.htm" title="数学是科学技术的语言" target="_blank">数学是科学技术的语言</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a><a class="tag" taget="_blank" href="/search/%E6%B4%BB%E5%8A%A8/1.htm">活动</a><a class="tag" taget="_blank" href="/search/%E9%A2%86%E5%9F%9F%E6%A8%A1%E5%9E%8B/1.htm">领域模型</a> <div>  从小学到大学都在学习数学,从小学开始了解数字的概念和背诵九九表到大学学习复变函数和离散数学,看起来好像掌握了这些数学知识,但是在工作中却很少真正用到这些知识,为什么?    最近在研究一种开源软件-CARROT2的源代码的时候,又一次感觉到数学在计算机技术中的不可动摇的基础作用,CARROT2是一种用于自动语言分类(聚类)的工具性软件,用JAVA语言编写,它</div> </li> <li><a href="/article/2409.htm" title="Linux系统手动安装rzsz 软件包" target="_blank">Linux系统手动安装rzsz 软件包</a> <span class="text-muted">daizj</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/sz/1.htm">sz</a><a class="tag" taget="_blank" href="/search/rz/1.htm">rz</a> <div>1、下载软件 rzsz-3.34.tar.gz。登录linux,用命令 wget http://freeware.sgi.com/source/rzsz/rzsz-3.48.tar.gz下载。 2、解压 tar zxvf  rzsz-3.34.tar.gz 3、安装  cd rzsz-3.34 ; make posix 。注意:这个软件安装与常规的GNU软件不</div> </li> <li><a href="/article/2536.htm" title="读源码之:ArrayBlockingQueue" target="_blank">读源码之:ArrayBlockingQueue</a> <span class="text-muted">dieslrae</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>    ArrayBlockingQueue是concurrent包提供的一个线程安全的队列,由一个数组来保存队列元素.通过 takeIndex和 putIndex来分别记录出队列和入队列的下标,以保证在出队列时 不进行元素移动. //在出队列或者入队列的时候对takeIndex或者putIndex进行累加,如果已经到了数组末尾就又从0开始,保证数</div> </li> <li><a href="/article/2663.htm" title="C语言学习九枚举的定义和应用" target="_blank">C语言学习九枚举的定义和应用</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/c/1.htm">c</a> <div>枚举的定义 # include <stdio.h> enum WeekDay { MonDay, TuesDay, WednesDay, ThursDay, FriDay, SaturDay, SunDay }; int main(void) { //int day; //day定义成int类型不合适 enum WeekDay day = Wedne</div> </li> <li><a href="/article/2790.htm" title="Vagrant 三种网络配置详解" target="_blank">Vagrant 三种网络配置详解</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/vagrant/1.htm">vagrant</a> <div> Forwarded port Private network Public network Vagrant 中一共有三种网络配置,下面我们将会详解三种网络配置各自优缺点。 端口映射(Forwarded port),顾名思义是指把宿主计算机的端口映射到虚拟机的某一个端口上,访问宿主计算机端口时,请求实际是被转发到虚拟机上指定端口的。Vagrantfile中设定语法为: c</div> </li> <li><a href="/article/2917.htm" title="16.性能优化-完结" target="_blank">16.性能优化-完结</a> <span class="text-muted">frank1234</span> <a class="tag" taget="_blank" href="/search/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/1.htm">性能优化</a> <div>性能调优是一个宏大的工程,需要从宏观架构(比如拆分,冗余,读写分离,集群,缓存等), 软件设计(比如多线程并行化,选择合适的数据结构), 数据库设计层面(合理的表设计,汇总表,索引,分区,拆分,冗余等) 以及微观(软件的配置,SQL语句的编写,操作系统配置等)根据软件的应用场景做综合的考虑和权衡,并经验实际测试验证才能达到最优。 性能水很深, 笔者经验尚浅 ,赶脚也就了解了点皮毛而已,我觉得</div> </li> <li><a href="/article/3044.htm" title="Word Search" target="_blank">Word Search</a> <span class="text-muted">hcx2013</span> <a class="tag" taget="_blank" href="/search/search/1.htm">search</a> <div>Given a 2D board and a word, find if the word exists in the grid. The word can be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or ve</div> </li> <li><a href="/article/3171.htm" title="Spring4新特性——Web开发的增强" target="_blank">Spring4新特性——Web开发的增强</a> <span class="text-muted">jinnianshilongnian</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/spring+mvc/1.htm">spring mvc</a><a class="tag" taget="_blank" href="/search/spring4/1.htm">spring4</a> <div>Spring4新特性——泛型限定式依赖注入 Spring4新特性——核心容器的其他改进 Spring4新特性——Web开发的增强 Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC  Spring4新特性——Groovy Bean定义DSL Spring4新特性——更好的Java泛型操作API  Spring4新</div> </li> <li><a href="/article/3298.htm" title="CentOS安装配置tengine并设置开机启动" target="_blank">CentOS安装配置tengine并设置开机启动</a> <span class="text-muted">liuxingguome</span> <a class="tag" taget="_blank" href="/search/centos/1.htm">centos</a> <div>yum install gcc-c++  yum install pcre pcre-devel  yum install zlib zlib-devel  yum install openssl openssl-devel Ubuntu上可以这样安装 sudo aptitude install libdmalloc-dev libcurl4-opens</div> </li> <li><a href="/article/3425.htm" title="第14章 工具函数(上)" target="_blank">第14章 工具函数(上)</a> <span class="text-muted">onestopweb</span> <a class="tag" taget="_blank" href="/search/%E5%87%BD%E6%95%B0/1.htm">函数</a> <div>index.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/</div> </li> <li><a href="/article/3552.htm" title="Xelsius 2008 and SAP BW at a glance" target="_blank">Xelsius 2008 and SAP BW at a glance</a> <span class="text-muted">blueoxygen</span> <a class="tag" taget="_blank" href="/search/BO/1.htm">BO</a><a class="tag" taget="_blank" href="/search/Xelsius/1.htm">Xelsius</a> <div>Xelsius提供了丰富多样的数据连接方式,其中为SAP BW专属提供的是BICS。那么Xelsius的各种连接的优缺点比较以及Xelsius是如何直接连接到BEx Query的呢? 以下Wiki文章应该提供了全面的概览。   http://wiki.sdn.sap.com/wiki/display/BOBJ/Xcelsius+2008+and+SAP+NetWeaver+BW+Co</div> </li> <li><a href="/article/3679.htm" title="oracle表空间相关" target="_blank">oracle表空间相关</a> <span class="text-muted">tongsh6</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a> <div>在oracle数据库中,一个用户对应一个表空间,当表空间不足时,可以采用增加表空间的数据文件容量,也可以增加数据文件,方法有如下几种: 1.给表空间增加数据文件    ALTER TABLESPACE "表空间的名字" ADD DATAFILE    '表空间的数据文件路径' SIZE 50M;   &nb</div> </li> <li><a href="/article/3806.htm" title=".Net framework4.0安装失败" target="_blank">.Net framework4.0安装失败</a> <span class="text-muted">yangjuanjava</span> <a class="tag" taget="_blank" href="/search/.net/1.htm">.net</a><a class="tag" taget="_blank" href="/search/windows/1.htm">windows</a> <div>上午的.net framework 4.0,各种失败,查了好多答案,各种不靠谱,最后终于找到答案了 和Windows Update有关系,给目录名重命名一下再次安装,即安装成功了! 下载地址:http://www.microsoft.com/en-us/download/details.aspx?id=17113 方法: 1.运行cmd,输入net stop WuAuServ 2.点击开</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>