Linux学习笔记(一):文件权限和find查找文件

一、文件安全与权限

1、目录的权限位意味着可以列出其中的内容。
权限位意味着可以在该目录中创建文件,如果不希望其他用户在你的目录中创建文件,可以取消相应的写权限位。
执行权限位则意味着搜索和访问该目录。

2、目录的权限将会覆盖该目录中文件的权限。例如,如果目录docs具有如下的权限:
drwx r-- r-- 1 louise admin ......
而其中的文件pay的权限为:
-rwx rwx rwx 1 louise admin ......
那么admin组的其他用户将无法编辑该文件,因为它所属的目录不具有这样的权限。
该文件对任何用户都可读,但由于它所在的目录并未给admin组的用户赋予执行权限,所以该组的用户都将无法访问该目录,他们将会得到“访问受限”的错误消息。

3、注意,chmod命令不进行必要的完整性检查,可以给某一个没用的文件赋予任何权限,但chmod命令并不会对所设置的权限组合做什么检查。因此,不要看到一个文件具有执行权限,就认为它一定是一个程序或脚本。

4、只有文件的属主和系统管理员可以改变文件的所有权。一旦将文件的所有权交给另外一个用户,就无法再重新收回它的所有权。
chown命令的一般形式为:
chmod -R -h owner file
-R选项意味着对所有子目录下的文件也都进行同样的操作。-h选项意味着在改变符号链接文件的属主时不影响该链接所指向的目标文件。

5、改变所有组:chgrp命令和chown命令的格式差不多
$ chgrp sybadmin project
现在把project文件所属的组由admin变为sybadmin(系统中的另外一个用户组)

6、查看自己所属的组:id 或groups
查看其他用户所属的组:groups tom

7、存在两种不同类型的链接,软链接和硬链接。软链接实际上就是一个指向文件的指针。你将会发现这种软链接使用起来非常方便。
该命令的一般形式为:
ln [-s] source_path target_path
其中的路径可以是目录也可以是文件。
不管是否在同一个文件系统中,都可以创建链接。在创建链接的时候,不要忘记在原有目录设置执行权限。链接一旦创建,链接目录将具有权限777或rwx rwx rwx ,但是实际的原有文件的权限并未改变。

二、使用find和xargs

Find命令的一般形式为:
find pathname -options [-print -exec -ok]
让我们来看看该命令的参数:

pathname find命令所查找的目录路径。例如用 .来表示当前目录,用 /来表示系统根目录。
-print find命令将匹配的文件输出到标准输出。
-exec find 命令对匹配的文件执行该参数所给出的 shell命令。相应命令的形式为'command' {} \;,注意{ }和\;之间的空格。
-ok 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的 shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。

find命令有很多选项或表达式,每一个选项前面跟随一个横杠 - 。让我们先来看一下该命令的主要选项,然后再给出一些例子。

-name 按照文件名查找文件。
文件名选项是find命令最常用的选项,要么单独使用该选项,要么和其他选项一起使用。可以使用某种文件名模式来匹配文件,记住要用引号将文件名模式引起来。
e.g. 1)想要在当前目录及子目录中查找所有的txt文件,可以用:
$ find . -name "*.txt" -print
2)想要在当前目录及子目录中查找文件名以一个大写字母开头的文件,可以用:
$ find . -name "[A-Z]*" -print
3)想要在/etc目录中查找文件名以host开头的文件,可以用:
$ find /etc -name "host*" -print
4)如果想在当前目录查找文件名以两个小写字母开头,跟着是两个数字,最后是*.txt的文件,下面的命令就能够返回名为ax37.txt的文件:
$ find . -name "[a-z][a-z][0-9][0-9].txt" -print
5)如果想在当前目录查找文件名包含一个小写字母连着一个大写字母,再接着是两个数字,最后是*.txt的文件,下面的命令就能够返回名为axA12.txt的文件:
$ find . -name "*[a-z][A-Z][0-9][0-9]*.txt" -print


-perm 按照文件权限来查找文件。在使用这一选项的时候,最好使用八进制的权限表示法。
在当前目录下查找文件权限位为755的文件,即文件属主可以读、写、执行,其他用户可以读、执行的文件,可以用:
$ find . -perm 755 -print


-prune 使用这一选项可以使 find命令不在当前指定的目录中查找,如果同时使用了-depth选项,那么-prune 选项将被find命令忽略。
如果希望在/apps目录下查找文件,但不希望在/apps/bin 目录下查找,可以用:
$ find /apps -name "/apps/bin" -prune -o -print


-user -nouser按照文件属主来查找文件。
例如,在$HOME目录中查找文件属主为dave的文件,可以用:
$ find ~ -user dave -print
在/etc目录下查找文件属主为uucp的文件:
$ find /etc -user uucp -print
为了查找属主帐户已经被删除的文件,可以使用 -nouser 选项。这样就能够找到那些属主在/etc/passwd文件中没有有效帐户的文件。在使用-nouser选项时,不必给出用户;find命令能够为你完成相应的工作。例如,希望在/home目录下查找所有的这类文件,可以用:
$ find /home -nouser -print


-group -nogroup按照文件所属的组来查找文件。
在/apps目录下查找属于accts用户组的文件,可以用:
$ find /apps -group accts -print
从文件系统的根目录处查找没有有效用户组的文件
$ find / -nogroup -print


-mtime -n +n 按照文件的更改时间来查找文件, -n表示文件更改时间距现在 n天以内,+n表示文件更改时间距现在 n天以前。find命令还有-atime 和-ctime选项,但它们都和 -mtime选项相似,所以我们在这里只介绍 -mtime选项。
在系统根目录下查找更改时间在 5日以内的文件,可以用:
$ find / -mtime -5 -print


-newer file1 ! file2 查找更改时间比文件file1新但比文件file2旧的文件。

如果想使用find命令的这一选项来查找更改时间在两个小时以内的文件,除非有一个现成的文件其更改时间恰好在两个小时以前,否则就没有可用来比较更改时间的文件。为了解决这一问题,可以首先创建一个文件并将其日期和时间戳设置为所需要的时间。这可以用touch命令来实现。
假设现在的时间是 23:40,希望查找更改时间在两个小时以内的文件,可以首先创建这样一个文件:
$ touch -t 05042140 dstamp
一个符合要求的文件已经被创建;这里我们假设今天是五月四日,而该文件的更改时间是21:40,比现在刚好早两个小时。
现在我们就可以使用find命令的-newer选项在当前目录下查找所有更改时间在两个小时以内的文件:
$ find . -newer dstamp -print


-type 查找某一类型的文件,诸如:
b - 块设备文件。
d - 目录。
c - 字符设备文件。
p - 管道文件。
l - 符号链接文件。
f - 普通文件。
在/etc目录下查找所有的目录,可以用:
$ find /etc -type d -print
在当前目录下查找除目录以外的所有类型的文件,可以用:
$ find . ! -type d -print
为了在/etc目录下查找所有的符号链接文件,可以用:
$ find /etc -type l -print


-size n[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。
为了在当前目录下查找文件长度大于 1M字节的文件(1kB = 1024Bytes More),可以用:
$ find . -size +1000000c -print
为了在/home/apache目录下查找文件长度恰好为100字节的文件,可以用:
$ find /home/apache -size 100c -print
为了在当前目录下查找长度超过10块的文件(一块等于512字节),可以用:
$ find . -size +10 -print


-depth 在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
在下面的例子中,find命令从文件系统的根目录开始,查找一个名为CON.FILE的文件。它将首先匹配所有的文件然后再进入子目录中查找。
$ find / -name "CON.FILE" -depth -print


-fstype 查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件/etc/fstab中找到,该配置文件中包含了本系统中有关文件系统的信息。


-mount 在当前的文件系统中查找文件时,不进入其他文件系统(例如win+Linux双系统下,在Linux下,文件系统同时挂载了NTFS文件系统)。
在下面的例子中,我们从当前目录开始查找位于本文件系统中文件名以XC结尾的文件:
$ find . -name "*.XC" -mount -print


-follow 如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。


-cpio 对匹配的文件使用cpio命令,将这些文件备份到磁带设备中。
$ find etc home apps -depth -print | cpio -ivcdC65536 -o /dev/rmt0 (根目录下执行)
在上面的例子中,应当注意到路径中缺少 / 。这叫作相对路径。之所以使用相对路径,是因为在从磁带中恢复这些文件的时候,可以选择恢复文件的路径。例如,可以将这些文件先恢复到另外一个目录中,对它们进行某些操作后,再恢复到原始目录中。如果在备份时使用了绝对路径,例如/etc ,那么在恢复时,就只能恢复到/etc 目录中去,别无其他选择。在上面的例子中,我告诉find命令首先进入/etc 目录,然后是/home 和/apps 目录,先匹配这些目录下的文件,然后再匹配其子目录中的文件,所有这些结果将通过管道传递给cpio命令进行备份。
顺便说一下,在上面的例子中cpio命令使用了C65536选项,我本可以使用 B选项,不过这样每块的大小只有512字节,而使用了C65536 选项后,块的大小变成了64K字节(65536/1024)。

标签: linux, find, chmod, chgrp, ln

添加新评论