Linux Shell 用法(三)1.文件的相关操作

本文详细介绍了Linux Shell中关于文件的各种操作,包括如何生成任意大小的文件、使用dd和comm命令处理文本文件的交集与差集、查找并删除重复文件、理解文件权限、所有权与粘滞位、设置文件为不可修改、批量生成空白文件、查找符号链接及其目标以及统计文件类型信息。

生成任意大小的文件

dd
if表示输入文件(input file);
of表示输出文件(output file);
bs指定了以字节为单位的块大小(block size);
count表示需要被复制的块数。

$ dd if=/dev/zero of=junk.data bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.00767266 s, 137 MB/s

文本文件的交集与差集

comm命令可用于比较两个已排序的文件
交集(intersection):打印出两个文件所共有的行。
求差(difference):打印出指定文件中所包含的互不相同的那些行。
差集(set difference)1:打印出包含在文件A中,但不包含在其他指定文件(例如B和C)中的那些行。

$ sort A.txt -o A.txt ; sort B.txt -o B.txt

(1) 首先执行不带任何选项的comm:

$ comm A.txt B.txt

(2) 为了打印两个文件的交集,我们需要删除前两列,只打印出第三列。-1选项可以删除第 一列,-2选项可以删除第二列,最后留下的就是第三列:

$ comm A.txt B.txt -1 -2

(3) 删除第三列,就可以打印出两个文件中互不相同的那些行:

$ comm A.txt B.txt -3

(4) 可以使用tr(在第2章中讲到过)删除制表符来合并两列:

$ comm A.txt B.txt -3 | tr -d '\t'

(5) 通过删除不需要的列,我们就可以分别得到A.txt和B.txt的差集。
A.txt的差集

$ comm A.txt B.txt -2 -3 -2 -3 删除第二列和第三列。

B.txt的差集

$ comm A.txt B.txt -1 -3 -1 -3 删除第一列和第三列。

comm的命令行选项可以减少输出。
-1:删除第一列。
-2:删除第二列。
-3:删除第三列。

查找并删除重复文件


$ echo "hello" > test ; cp test test_copy1 ; cp test test_copy2; $ echo "next" > other;
# test_copy1和test_copy2都是test文件的副本
# !/bin/bash 11 # 文件名: remove_duplicates.sh
# 用途: 查找并删除重复文件,每一个文件只保留一份

ls -lS --time-style=long-iso | awk 'BEGIN {
   getline; getline;
  name1=$8; size=$5
}
{
name2=$8;
   if (size==$5{
          "md5sum "name1 | getline; csum1=$1;
          "md5sum "name2 | getline; csum2=$1;
          if ( csum1==csum2 )
          {
             print name1; print name2
          }
};
size=$5; name1=name2;
}' | sort -u > duplicate_files
cat duplicate_files | xargs -I {} md5sum {} | \ sort | uniq -w 32 | awk '{ print $2 }' | \
sort -u > unique_files
echo Removing..
comm duplicate_files unique_files -3 | tee /dev/stderr | \
xargs rm
echo Removed duplicates files successfully.

$ ./remove_duplicates.sh   

文件权限、所有权与粘滞位

ls命令的-l选项可以显示出包括文件类型、权限、所有者以及组在内的多方面信息:

-:普通文件。
d:目录。
c:字符设备。
b:块设备。
l:符号链接。
s:套接字。
p:管道。

chmod命令设置文件权限:

$ chmod u=rwx g=rw o=r filename

命令中用到的选项如下。
u:指定用户权限。
g:指定用户组权限。
o:指定其他用户权限。

$ chmod o+x filename

该命令为其他用户添加了x权限。
给所有权限类别(即用户、用户组和其他用户)添加可执行权限:

$ chmod a+x filename

其中,a表示全部(all)。
如果需要删除权限,则使用-,例如:

$ chmod a-x filename
  1. 更改所有权
    $ chown user:group filename
$ chown slynux:users test.sh
在这里,slynux是用户名,users是组名。
  1. 设置粘滞位
使用chmod的+t选项设置: 
$ chmod a+t directory_name
  1. 以递归方式设置文件权限
$ chmod 777 . -R 选项-R指定以递归的方式修改权限。
用.指定当前工作目录,这等同于: $ chmod 777 "$(pwd)" -R

  1. 以递归的方式设置所有权
用chown命令的-R能够以递归的方式设置所有权:
$ chown user:group . -R

  1. 以不同的身份运行可执行文件(setuid)
$ chmod +s executable_file
# chown root:root executable_file # chmod +s executable_file
$ ./executable_file

将文件设置为不可修改

chattr命令可用于更改扩展属性。它能够将文件设置为不可修改,也可以修改其他属性来
调节文件系统同步或压缩率。

(1) 使用chatter将文件设置为不可修改:

# chattr +i file

(2) 现在文件已经无法修改了。来试试下面的命令:

rm file
rm: cannot remove 'file': Operation not permitted

(3) 如果需要使文件恢复可写状态,撤销不可修改属性即可:

chattr -i file

批量生成空白文件

touch命令可以用来生成空白文件或是修改已有文件的时间戳。
(1) 调用touch命令并使用一个不存在的文件名作为参数,创建空白文件:

$ touch filename

(2) 批量生成不同名字的空白文件:

for name in {1..100}.txt 
do
    touch $name
done

touch -a 只更改文件访问时间。
touch -m 只更改文件修改时间。

除了将时间戳更改为当前时间,我们还能够指定特定的时间和日期:

$ touch -d "Fri Jun 25 20:50:14 IST 1999" filename

查找符号链接及其指向目标

(1) 创建符号链接:

$ ln -s target symbolic_link_name

例如:

$ ln -l -s /var/www/ ~/web 这个命令在当前用户的主目录中创建了一个名为Web的符号链接。该链接指向/var/www。

(2) 使用下面的命令来验证链接是否已建立:

$ ls -l web
lrwxrwxrwx 1 slynux slynux 8 2010-06-25 21:34 web -> /var/www
web -> /var/www表明web指向 /var/www。

(3) 打印出当前目录下的符号链接:

$ ls -l | grep "^l"

(4) 打印出当前目录及其子目录下的符号链接:

$ find . -type l -print

(5) 使用readlink打印出符号链接所指向的目标路径:

$ readlink web
/var/www

枚举文件类型统计信息

(1) 用下面的命令打印文件类型信息:

$ file filename
$ file /etc/passwd
/etc/passwd: ASCII text

(2) 打印不包括文件名在内的文件类型信息:

$ file -b filename
ASCII text

(3) 生成文件统计信息的脚本如下:

# !/bin/bash
# 文件名: filestat.sh
if [ $# -ne 1 ]; then
         echo "Usage is $0 basepath";
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 :  ${statarray["$ftype"]}
       done

(4) 用法如下:

$ ./filestat.sh /home/slynux/temp

(5) 输出信息如下:

$ ./filetype.sh /home/slynux/programs
============ File types and counts ============= Vim swap file : 1
ELF 32-bit LSB executable : 6
ASCII text : 2
ASCII C program text : 10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值