linux:文件及目录管理

http://blog.csdn.net/pipisorry/article/details/39854265

查看用户的信息

pika:~$id pika
uid=1000(pika) gid=1000(pika) groups=1000(pika),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),108(lpadmin),124(sambashare),125(docker)

目录与路径

cd:变换目弽
pwd:显示弼前目弽

新建目录

mkdir:建立一个新的目录

  -m, --mode=模式,设定权限<模式> (类似 chmod),而不是 rwxrwxrwx 减 umask
  -p, --parents  可以是路径名称。此时若路径中的某些目录尚不存在,系统将自动建立,一次可以建立多个目录。
  -v, --verbose  每次创建新目录都显示信息
rmdir:删除一个空的目录

切换目录命令cd

cd [目录名] :切换当前目录至dirName (Change the current directory to DIR) 
1. cd / 进入系统根目录 
2. cd .. 返回上一级目录 
3. cd ~ 或cd 当前用户主目录 
(注意:“当前用户主目录”和“系统根目录”是两个不同的概念) 

4. cd - 返回进入此目录之前所在的目录

.         代表此层目录
..        代表上一层目录
-         代表前一个工作目录
~         代表“目前使用者身份”所在的主文件夹
~account  代表 account 这个使用者的主文件夹(account是个帐号名称)

皮皮blog

 

 

文件与目录管理

删除rm

rm -rf dir #删除目录下所有文件

rm -rf删除不了文件夹

#rm -rf 推荐系统1/
rm: cannot remove ‘推荐系统1/’: Directory not empty
linux:文件及目录管理_第1张图片

在删除某个目录时,若有进程往该目录写入数据,则需要先停止该进程的服务(或kill掉该进程),所以我们的一些Shell代码在卸载或删除目录时就存在失败的可能。

[最暴力的 rm -rf 命令居然删除目录失败了!为什么?]

不过更可能是文件系统出错了(lz就是,可能是因为之前删除未完成时取消了吧):

Apparently there was a corruption in the filesystem that was preventing me from deleting the directory. Here are the steps I performed. Your mileage may vary...
Boot into archlinux live CD.
btrfsck --repair /dev/sda1
mount -t btrfs /dev/sda1 /mnt
rm -Rf /mnt/__active/home/$USER/.config/chromium~
umount /mnt
reboot
Warning: There are risks in performing the btrfsck --repair command. I suggest backing up any essential data prior to running that command. Read the link provided by rebootl above for more information on the risks.

这样的话,最好开机时进行disk检查。如windows开机时设置检查就可以检查出错误,这样就可以删除这个目录了。

[[Solved] rm: cannot remove DIRECTORY: Directory not empty]

[cannot delete file with rm -rf]

移动: rm, mv

mv [-fiu] source destination

mv [options] source1 source2 source3 .... directory

选项与参数:
-f  :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖;
-i  :若目标文件 (destination) 已经存在时,就会询问是否覆盖!
-u  :若目标文件已经存在,且 source 比较新,才会更新 (update)

目录(包含子文件夹)的转移:mv dir1/ dir2/ 

如果直接mv带子文件夹的文件夹不行,报错说文件夹不为空,这时可以先cp再rm -rf:cp -r a/ /tmp/, rm -rf a/

文件拷贝和备份cp

cp [-adfilprsu] 来源文件(source) 目标文件(destination)

如sudo cp a a.$(date +%Y-%m-%d)

cp [options] source1 source2 source3 .... directory

选项与参数:

-a  :相当于 -dr --preserve=all 的意思,至于 dr 请参考下列说明;(常用)
-d  :若来源文件为链接文件的属性(link file),则复制链接文件属性而非文件本身;
-f  :为强制(force)的意思,若目标文件已经存在且无法打开,则移除后再尝试一次;
-i  :若目标文件(destination)已经存在时,在覆盖时会先询问动作的进行(常用)
-l  :进行硬式链接(hard link)的链接文件创建,而非复制文件本身;
-p  :连同文件的属性(权限、用户、时间)一起复制过去,而非使用默认属性(备份常用);
-r  :递回持续复制,用于目录的复制行为;(常用)
-s  :复制成为符号链接文件 (symbolic link),亦即“捷径”文件;
-u  :destination 比 source 旧才更新 destination,或 destination 不存在的情况下才复制。
--preserve=all :除了 -p 的权限相关参数外,还加入 SELinux 的属性, links, xattr 等也复制了。
最后需要注意的,如果来源文件有两个以上,则最后一个目的文件一定要是“目录”才行!

RSync实现文件备份同步

rsync -aXS /var/lib/docker/.  DIR

-a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性

[linux下rsync命令详细整理]

[RSync实现文件备份同步]

取得文件的文件名与目录名

basename /etc/sysconfig/network
network     获取最后的文件名。
dirname /etc/sysconfig/network
/etc/sysconfig      获取的变成目录名了

也可以在脚本中执行着用../../$(basename $DIR)

文件链接

使用方式 : ln [options] source dist,其中 option 的格式为 :
  [-bdfinsvF] [-S backup-suffix] [-V {numbered,existing,simple}]
  [--help] [--version] [--]    
ln命令会保持每一处链接文件的同步性,也就是说,不论你改动了哪一处,其它的文件都会发生相同的变化;
    ln的链接分软链接和硬链接两种,软链接就是ln –s ** **,它只会在你选定的位置上生成一个文件的镜像,不会占用磁盘空间,硬链接ln ** **,没有参数-s, 它会在你选定的位置上生成一个和源文件大小相同的文件,无论是软链接还是硬链接,文件都保持同步变化。
  如果你用ls察看一个目录时,发现有的文件后面有一个@的符号,那就是一个用ln命令生成的文件,用ls –l命令去察看,就可以看到显示的link的路径了。
文件夹建立软链接(必须要用绝对地址)
  ln -s 源地址  目的地址
如把linux文件系统目录rootfs_dir软链接到/home/jyg/目录下
  ln -s /opt/linux/rootfs_dir  /home/jyg/rootfs_dir

把一个文件夹下的所有文件及文件晋代软连接到另一个文件夹下

ln -s `pwd`/source/* target/

Note: 如果你使用的是zsh ,那么在你使用通配符 * 匹配的时候,会出现 zsh: no matches found 的问题。解决: 1.在 ~/.zshrc 中加入:setopt no_nomatch 2.执行 source ~/.zshrc

皮皮blog

 

 

文件内容查阅

基本指令

  • cat 由第一行开始显示文件内容
  • tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写!
  • nl 显示的时候,顺道输出行号!
  • more 一页一页的显示文件内容
  • less 与 more 类似,但是比 more 更好的是,他可以往前翻页!
  • head [-n 100]只看头几行
  • tail 只看尾巴几行
  • od 以二进制的方式读取文件内容!

cat 由第一行开始显示文件内容

cat (concatenate)
选项与参数:
-A  :相当于 -vET 的整合选项,可列出一些特殊字符而不是空白而已;
-b  :列出行号,仅针对非空白行做行号显示,空白行不标行号!
-E  :将结尾的断行字符 $ 显示出来;
-n  :打印出行号,连同空白行也会有行号,与 -b 的选项不同;
-T  :将 [tab] 按键以 ^I 显示出来;
-v  :列出一些看不出来的特殊字符

Note: linux中的不可见字符有:^I表示一个tab符,$表示一个回车符,^M$表示windows下的回车换行符。

Head和tail

tail -n 1000:显示最后1000行

tail -n +1000:从1000行开始显示,显示1000行以后的

head -n 1000:显示前面1000行

从第3000行开始,显示1000行。即显示3000~3999行:cat filename | tail -n +3000 | head -n 1000

或者也可以用sed命令:sed -n '5,10p' filename 查看文件的第5行到第10行。

cat file| (head && tail) :同时查看文件头10行和尾10行

[How to read first and last line from cat output?]

 

vim 使用注意事项

查看文件类型和编码file

$ file -i 50万条.csv
50万条.csv: text/plain; charset=iso-8859-1
pipi@pipicmp:~/files/DATASETS/深圳一卡通数据$ file -i 50万条1.csv

50万条1.csv: text/plain; charset=utf-8

语系编码转换iconv

iconv选项
-f, --from-code=名称 原始文本编码
-t, --to-code=名称 输出编码
-l, --list 列举所有已知的字符集
-c 从输出中忽略无效的字符
-o, --output=FILE 输出文件
-s, --silent 关闭警告
--verbose 打印进度信息

递归转换(包括子文件夹)
find default -type d -exec mkdir -p utf/{} \;
find default -type f -exec iconv -f GBK -t UTF-8 {} -o utf/{} \;

[linux-利用iconv批量转换GBK文件到UTF-8编码方法]

DOS 与 Linux 的断行字符

Note: Unix系统里,每行结尾只有"<换行>",即"\n";Windows系统里面,每行结尾是"<回车><换行>",即"\r\n";Mac系统里,每行结尾是"<回车>"。一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。

要安装:sudo apt-get install -y dos2unix$ dos2unix [-kn] file [newfile]

$ unix2dos [-kn] file [newfile] 选项与参数: -k :保留该文件原本的 mtime 时间格式 (不更新文件上次内容经过修订的时间) -n :保留原本的旧文件,将转换后的内容输出到新文件,如: dos2unix -n old new

将 man_db.conf 转成 Linux 断行字符,并保留旧文件,新文件放于 man_db.conf.linux

$ dos2unix -k -n man_db.conf man_db.conf.linux

打开文件的默认命令

打开所有文件方法:
    在Ubuntu下,当需要打开其他格式文件时,咱们通常做法是进入到文件所在的目录,双击打开,很影响效率。事实上,可以通过命令xdg-open打开这些格式文件,甚至是网页,像打开文件一样简单。xdg-open会选择合适的程序打开指定文件,跟双击打开效果一样。

$ xdg-open filename &
$ xdg-open ***.mp3
$ xdg-open http://baidu.com
具体操作如下:
xdg-open { file | URL }
xdg-open { --help | --manual | --version }
通过快捷键Ctrl+Alt+T可以打开shell,F11可以全屏显示(Alt+F9最小化窗口,Alt+F10最大化/恢复窗口),再辅予xdg-open命令,极大减少了鼠标操作,也大大提升了效率。

打开  .doc .docx .xls .xlsx .ppt .pptx
libreoffice filename &

打开pdf文件
evince filename.pdf &

Note: 忘了打&可以 Ctrl+z,然后打bg回车;文件名中含空格要打成'\ '

创建新文件命令touch

touch myproject/settings/{__init.py,dev.py,prod.py,test.py}

Note:{...}可以创建多个文件

皮皮blog

 

 

命令与文件的查询

在 Linux 下面也有相当优异的搜寻指令!

通常 find 不很常用的!因为速度慢之外, 也很操硬盘!一般我们都是先使用 whereis 或者是 locate 来检查,如果真的找不到了,才以 find 来搜寻!为什么呢?因为 whereis 只找系统中某些特定目录下面的文件而已,locate 则是利用数据库来搜寻文件名,当然两者就相当的快速, 并且没有实际的搜寻硬盘内的文件系统状态

which (寻找“可执行文件”)

# which [-a] command
-a :将所有由 PATH 目录中可以找到的指令均列出,而不止第一个被找到的指令名称

 

whereis (由一些特定的目录中寻找文件文件名)

# whereis [-bmsu] 文件或目录名
选项与参数:
-l    :可以列出 whereis 会去查询的几个主要目录而已
-b    :只找 binary 格式的文件
-m    :只找在说明文档 manual 路径下的文件
-s    :只找 source 来源文件
-u    :搜寻不在上述三个项目当中的其他特殊文件
# whereis passwd     # 全部的文件名通通列出来!
# whereis -m passwd  # 只有在 man 里面的文件名才抓出来!

 

locate / updatedb

# locate [-ir] keyword
选项与参数:
-i  :忽略大小写的差异;
-c  :不输出文件名,仅计算找到的文件数量
-l  :仅输出几行的意思,例如输出五行则是 -l 5
-S  :输出 locate 所使用的数据库文件的相关信息,包括该数据库纪录的文件/目录数量等
-r  :后面可接正则表达式的显示方式

 

find文件查找命令

[linux find命令]

皮皮blog

 

 

文件与目录的默认权限与隐藏

Linux文件属性ls命令

在你以root的身份登入Linux之后,下达ls -al 看看,会看到底下的几个咚咚:

[root@www ~]# ls -al

total 156
drwxr-x---   4    root   root     4096   Sep  8 14:06 .
drwxr-xr-x  23    root   root     4096   Sep  8 14:21 ..
-rw-------   1    root   root     1474   Sep  4 18:27 anaconda-ks.cfg
-rw-------   1    root   root      199   Sep  8 17:14 .bash_history
-rw-r--r--   1    root   root       24   Jan  6  2007 .bash_logout
-rw-r--r--   1    root   root      191   Jan  6  2007 .bash_profile
-rw-r--r--   1    root   root      176   Jan  6  2007 .bashrc
-rw-r--r--   1    root   root      100   Jan  6  2007 .cshrc
drwx------   3    root   root     4096   Sep  5 10:37 .gconf      <=范例说明处
drwx------   2    root   root     4096   Sep  5 14:09 .gconfd
-rw-r--r--   1    root   root    42304   Sep  4 18:26 install.log <=范例说明处
-rw-r--r--   1    root   root     5661   Sep  4 18:25 install.log.syslog
[    1   ][  2 ][   3  ][  4 ][    5   ][     6     ][       7          ]
[  权限  ][连结][拥有者][群组][文件容量bytes][  修改日期 ][      檔名        ]

 ls -lh:在应用 l 选项的同时应用 h 选项,会以合适的单位显示文件大小,比如以 K或者M 为单位显示。

linux:文件及目录管理_第2张图片

 

  • 第一个字符代表这个文件是『目录、文件或链接文件等等』:
     
    • 当为[ d ]则是目录,例如上表档名为『.gconf』的那一行;
    • 当为[ - ]则是文件,例如上表档名为『install.log』那一行;
    • 若是[ l ]则表示为连结档(link file);
    • 若是[ b ]则表示为装置文件里面的可供储存的接口设备(可随机存取装置);
    • 若是[ c ]则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。
  • 接下来的字符中,以三个为一组,且均为『rwx』的三个参数的组合。其中,[ r ]代表可读(read)、[ w ]代表可写(write)、[ x ]代表可执行(execute)。要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号[ - ]而已。
     
    • 第一组为『文件拥有者的权限』,以『install.log』那个文件为例,该文件的拥有者可以读写,但不可执行;
    • 第二组为『同群组的权限』;

改变文件属性与权限

chgrp :改变文件所属群组

chown :改变文件拥有者

chmod :改变文件的权限, SUID, SGID, SBIT等等的特性

Note: chgrp, chown等指令可能都需要使用root的身份才能够处理,并且不能通过-R来改变软链接目录下所有文件权限,一定要用实际目录。

chown

[root@www ~]# chown [-R] 账号名称 文件或目录
[root@www ~]# chown [-R] 账号名称:组名 文件或目录
选项与参数:
-R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件都变更

Note:用户必须是已经存在系统中的账号,也就是在/etc/passwd这个文件中有纪录的用户名称才能改变。

例如复制行为(cp)会复制执行者的属性与权限,所以复制的文件还是属于root所拥有(这里假设root是之前的owner),如此一来,即使你将文件拿给bin这个使用者了,那他仍然无法修改的(看属性/权限就知道了吧),所以你就必须要将这个文件的拥有者与群组修改一下。

范例

pika:~$sudo chown -R pika:pika /usr/local/hadoop-2.6.4

将install.log的拥有者改为bin这个账号:
[root@www ~]# chown bin install.log
[root@www ~]# ls -l
-rw-r--r--  1 bin  users 68495 Jun 25 08:53 install.log

将install.log的拥有者与群组改回为root:
[root@www ~]# chown root:root install.log
[root@www ~]# ls -l
-rw-r--r--  1 root root 68495 Jun 25 08:53 install.log

chmod

数字类型改变文件权限

文件的权限字符为:『-rwxrwxrwx』,这九个权限是三个三个一组的!其中,我们可以使用数字来代表各个权限,各权限的分数对照表如下:

r:4           w:2           x:1

每种身份(owner/group/others)各自的三个权限(r/w/x)分数是需要累加的,例如当权限为:[-rwxrwx---] 分数则是:

owner = rwx = 4+2+1 = 7      group = rwx = 4+2+1 = 7       others= --- = 0+0+0 = 0

# chmod [-R] xyz 文件或目录
选项与参数:
xyz : 就是刚刚提到的数字类型的权限属性,为 rwx 属性数值的相加。
-R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件都会变更

符号类型改变文件权限

我们可以藉由u, g, o来代表三种身份(1)user (2)group (3)others的权限!此外, a 则代表 all 亦即全部的身份!那么读写的权限就可以写成r, w, x!

# chmod  u=rwx,go=rx  .bashrc
# 注意喔!那个 u=rwx,go=rx 是连在一起的,中间并没有任何空格!
[root@www ~]# ls -al .bashrc
-rwxr-xr-x  1 root root 395 Jul  4 11:45 .bashrc

权限mask

权限mask的设置采用数字式的,同样第一个数字表示所有者的权限mask,第二个数字表示群组的权限mask,第三个数字表示其他用户的权限mask

如果umask=000,就表示不屏蔽任何用户的任何权限,即所有用户具有读、写和执行权限,再例如fmask=033,就表示文档所有者具有读、写和执行权限,而群组和其他用户只具有读取的权限。

[LINUX UMASK详解]

windows分区权限产生的问题

[linux系统挂载windows分区错误]

皮皮blog

from: http://blog.csdn.net/pipisorry/article/details/39854265

ref:

 

你可能感兴趣的:(Linux)