《Linux Shell 脚本攻略》学习记录之四

根据扩展名切分文件名
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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值