URL="www.google.com"
echo ${URL%.*} #移除.*所匹配的最右边的内容
www.google
echo ${URL%%.*} #将从右边开始一直匹配到最左边的*.移除(贪婪操作符)
www
echo ${URL#*.} #移除*.所匹配的最左边的内容
google.com
echo ${URL##*.} #将从左边开始一直匹配到最右边的*.移除(贪婪操作符)
批量重命名和移动
#!/bin/bash
count=1;
for img in `find . -iname '.png' -o -iname '*.jpg' -type f -maxdepth 1`
do
new=image-$count.${img##*.}
echo "Renaming $img to $new"
mv "$img" "$new"
let count++
done
将*.JPG更名为*.jpg
rename *.JPG *.jpg ???
将文件名中的空格替换成字符 “-”
rename 's/ /_/g' *
转换文件名的大小写
rename 'y/A-Z/a-z/' *
rename 'y/a-z/A-Z/' *
将所有的.mp3文件移入给定的目录
find path -type f -name "*.mp3" -exec mv {} target_dir \;
将所有的文件名中的空格替换为字符"-"
find path -type f -exec rename 's/ /_/g' {} \;
文件权限用户可执行文件通常会设置执行权限。用户还有一个称为setuid(S)的特殊权限,它出现在执行权限(x)的位置。
setuid权限允许用户以其拥有者的权限来执行可执行文件,即使这个可执行权限文件是由其他用户运行的。
目录有一个特殊的权限,叫做粘滞位。如果目录设置了,只有创建目录的用户才能删除目录中的文件,即使用户组和其他用户也有写
权限,也无能为力。其出现在其他用户权限中的可执行权限(x)位置。它使用t或T来表示。如果没有设置执行权限,但设置了其,就使用
t,如果设置了执行权限和其,就使用T。
chmod命令设置文件权限
chmod u=rwx g=rw o=r filename
u---指定用户权限
g---执行用户组权限
o---执行其他实体权限
chmod o+x filename
给所有权限,添加可执行权限
chmod a+x filename
chmod a-x filename
chmod 764 filename
设置粘滞位,利用chmod+t引用于目录
chmod a+t directory_name
以递归的方式设置权限
chmod 777 . -R
以不同的身份运行可执行文件
chmod +s executable_file
chown root.root executable_file
chmod +s executable_file
./executable_file
setuit的使用不是无限制的。为了确保安全,它只能应用在Linux ELF格式二进制文件上,而不能应用于脚本文件。
创建不可修改的文件
chattr +i file
恢复可写状态,移除不可修改设置
chattr -i file
批量生成空白文件
生成一个空白文件
touch filename
批量生成不同名字的空白文件
for name in {1...100}.txt
do
touch $name
done
如果文件已经存在,那么touch命令会将与该文件相关的所有时间戳都更改为当前时间。
touch -a 只更改文件访问时间
touch -m 只更改文件的修改时间
查找符号链接及其指向目标
创建符号链接
ln -s target symbolic_link_name
ln -l -s /var/www/ ~/web
ls -l web 验证
打印当前目录下的符号链接
ls -l | grep "^l"
用find打印当前目录及其子目录下的符号链接
fine . -type l -print
使用readlink打印出符号链接所指向的目标路径
readlink web
/var/www
生成文件统计信息的脚本
#!/bin/bash
if [ $# -ne 1 ];
then
echo "Usage is $0 base path";
exit
fi
path $1
declare -A statarray
while read line;
do
ftype=`file -b "$line" | cut -d, -f1`
let statarray["$ftype"]++;
done << (find $path -type f -print)
echo ===================== File types and counts=======================
for ftype in "${!statarray[@]}";
do
echo $ftype : ${statrray["$ftype"]}
done
玩转CD-ROM托盘
弹出光驱托盘
eject
合上光驱托盘
eject -t
打补丁
非一体化形式的diff输出如下:
diff version1.txt version2.txt
一体化形式diff输出如下:
diff -u version1.txt version2.txt
选项-u用于生成一体化输出。因为一体化输出的可读性更好,更易于看出两个文件之间的差异。
修补文件可以通过将diff的输出重定向到一个文件来生成。
diff -u version1.txt version2.txt > version.patch
修补
patch -p1 version1.txt < version.patch
再次执行将会还原,撤销修改。
使用-R 选项不会提示-n-y
生成目录差异信息
diff -Naur directory1 directory2
-N 将所有缺失的文件视为空文件
-a 将所有文件视为文本文件
-u 生成一体化输出
-r 遍历目录下的所有文件
使用head与tail打印文件的前10行和后10行
打印前10行
head file
指定打印前几行
head -n 4 file
打印出了最后M行之外的所有的行
head -n -M file
-M表示一个负数,并非选项。
打印最后10行
tail file
打印最后5行
tail -n 5 file
打印除了前M行之外的所有的行
tail -n +(M+1)
tail命令的一个重要用法是从一个内容不断增加的文件中读取数据。新增加的内容总是被添加到文件
尾部,因此当新内容被写入文件的时候,可以用tail将其显示出来。只是如果简单地使用tail的话,它只会
读取文件的最后10行,然后退出。但那时新的内容也许已经被其他进程追加到文件了。为了能够不间断地监视
文件的增长,tail有一个特殊的选项 -f或--follow,它们会使tail密切关注文件中新添加的内容,并随着
数据的增加持续保持更新:
tail -f growing_file
监视日志文件增加的命令如下:
tail -f /var/log/messages
或
dmesg | tail -f
tail有一个很有意思的特性:当某个给定进程结束之后,tail也会随之终结。
tail -f file.txt --pid $PID
只列出目录的各种方法
使用ls -d
ls -d */
使用grep结合ls -l:
ls -l | grep "^d"
使用find
find . -type d -maxdepth 1 -print
用命令行中使用pushd和popd进行快速定位
压入并切换路径
pushd /var/www
...
用以下命令查看栈内容
dirs
/usr/src /var/www /usr/share /etc
pushd +3 切换到编号对应目录,从0到n进行编号
popd
删除最后添加的路径并把当前目录更改为上一级目录。
popd +num可以从列表中移除特定的路径
num是从左到右,从0到n开始计数的。
统计文件的行数,单词书和字符数WC工具。
统计行数
wc -l file
统计单词数
wc -w file
统计字符数
wc -c file
分别打印文件行数,单词数,字符数
wc file
使用-L选项打印出文件中最长一行的长度
wc file -L
打印目录树
tree工具
tree 目录
重点标记出匹配的某种样式的文件
tree path -P PATTERN #用通用符描述样式
tree PATH -p "*.sh" # 用一个目录替代PATH
重点标记出除符合某种样式之外的那些文件
tree path -I PATTERN
使用-h选项同时打印出文件和目录的大小
tree -h
以HTML形式输出目录树
tree PATH -H http://localhost -o out.html