program-dog

2016年11月20日星期日

[Linux Fun]:8 如何处理文件夹

文件处理是*nix最基本的操作,本文示范如何在*nix上进行最基本的文件夹操作。

文件夹

文件夹



版权声明

Copyright 2016-2016 Program Dog

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled 'GNU Free Documentation License.


第8章 文件夹

这一章会对最常用的命令做一些简介:pwdcdlsmkdirrmdir。这些命令为任何Linux或Unix所共有。

同时,这一章也会涉及到bash中的绝对和相对路径以及路径补全。

8.1. pwd

pwd可以给出你当前所在的路径(工作目录)。现在打开一个终端(terminal),键入pwd,看看你的当前路径。

paul@debian8:~$ pwd
/home/paul

8.2. cd

你可以通过cd命令改变当前路径(切换目录)。

paul@debian8$ cd /etc
paul@debian8$ pwd
/etc
paul@debian8$ cd /bin 
paul@debian8$ pwd
/bin
paul@debian8$ cd /home/paul (注:这条命令不要照抄。)
paul@debian8$ pwd
/home/paul

8.2.1. cd ~

cd有一个切换到home目录的快捷方式,就是cd命令本身,或者cd ~。

paul@debian8$ cd /etc
paul@debian8$ pwd
/etc
paul@debian8$ cd
paul@debian8$ pwd
/home/paul
paul@debian8$ cd ~
paul@debian8$ pwd
/home/paul

8.2.2. cd ..

回到上一层目录:cd ..

paul@debian8$ pwd
/usr/share
paul@debian8$ cd ..
paul@debian8$ pwd
/usr
注:此处例子有修改。

cd到当前目录,cd . :-),我们一会儿还会用点.代替当前目录。

8.2.3. cd -

另一个有用的快捷方式是cd - 回到刚刚访问过的目录。

paul@debian8$
/home/paul
paul@debian8$ cd /etc
paul@debian8$ pwd
/etc
paul@debian8$ cd - 
/home/paul
paul@debian8$ cd -
/etc

8.3. 绝对和相对路径

注意绝对路径和相对路径的区别。斜杠/代表根目录(root),以根目录开头的路径就是绝对路径,反之就是相对路径

注:此处翻译有修改。

如果你在目录/home/paul下,想要切换到/home,得用cd /home而不能用cd home

paul@debian8$ pwd
/home/paul
paul@debian8$ cd home
bash: cd: home: No such file or directory
paul@debian8$ cd /home
paul@debian8$ pwd
/home

但如果你在根目录/下,那么用cd /home或者cd home皆可。

paul@debian8$ pwd 
/
paul@debian8$ cd home
paul@debian8$ pwd
/home
paul@debian8$ cd /
paul@debian8$ cd /home
paul@debian8$ pwd
/home

本书会不停提及当前目录这个概念。后面介绍如何配置shell变量$PS1时也会用到当前目录这个概念。

8.4. 路径补全

tab可以自动补全路径。尝试 cd /et,然后敲击tab,路径会被补全为cd /etc。但是输入cd /Et然后敲击tab,就不会起作用,因为根本不存在/Et开头的路径。

tab既省力,又可保证输入正确。

8.5. ls

可以通过ls列出当前文件夹下面的内容。

paul@debian8:~$ ls
allfiles.txt dmesg.txt services stuff summer.txt
paul@debian8:~$

8.5.1. ls -a

-a 参数经常被用于列出隐藏文件。linux系统中隐藏文件是以点(.)开头的文件。通常,隐藏文件是被隐藏的。

paul@debian8:~$ ls
allfiles.txt dmesg.txt services stuff summer.txt
paul@debian8:~$ ls -a
.    allfiles.txt   .bash_profile dmesg.txt  .lesshst   stuff
..  .bash_history   .bashrc       services  .ssh        summer.txt

8.5.2. ls -l

ls可以按照一定的格式列出文件。如ls -l(字母l,不是数字1)会列出文件详细信息。

注:此处翻译有修改。
paul@debian8:~$ ls -l
total 17296
-rw-r--r-- 1 paul paul 17584442 Sep 17 00:03 allfiles.txt
-rw-r--r-- 1 paul paul    96650 Sep 17 00:03 dmesg.txt
-rw-r--r-- 1 paul paul    19558 Sep 17 00:04 services
drwxr-xr-x 2 paul paul     4096 Sep 17 00:04 stuff
-rw-r--r-- 1 paul paul        0 Sep 17 00:04 summer.txt

8.5.3. ls -lh

另一个常用的参数是-h,以人类可读的方式列出文件大小。可以这样用,我们稍后解释这些结果的细节。

paul@debian8:~$ ls -l -h
total 17M
-rw-r--r-- 1 paul paul  17M Sep 17 00:03 allfiles.txt
-rw-r--r-- 1 paul paul  95K Sep 17 00:03 dmesg.txt
-rw-r--r-- 1 paul paul  20K Sep 17 00:04 services
drwxr-xr-x 2 paul paul 4.0K Sep 17 00:04 stuff
-rw-r--r-- 1 paul paul    0 Sep 17 00:04 summer.txt
paul@debian8:~$ ls -lh
total 17M
-rw-r--r-- 1 paul paul  17M Sep 17 00:03 allfiles.txt
-rw-r--r-- 1 paul paul  95K Sep 17 00:03 dmesg.txt
-rw-r--r-- 1 paul paul  20K Sep 17 00:04 services
drwxr-xr-x 2 paul paul 4.0K Sep 17 00:04 stuff
-rw-r--r-- 1 paul paul    0 Sep 17 00:04 summer.txt
paul@debian8:~$ ls -hl
total 17M
-rw-r--r-- 1 paul paul  17M Sep 17 00:03 allfiles.txt
-rw-r--r-- 1 paul paul  95K Sep 17 00:03 dmesg.txt
-rw-r--r-- 1 paul paul  20K Sep 17 00:04 services
drwxr-xr-x 2 paul paul 4.0K Sep 17 00:04 stuff
-rw-r--r-- 1 paul paul    0 Sep 17 00:04 summer.txt
paul@debian8:~$ ls -h -l
total 17M
-rw-r--r-- 1 paul paul  17M Sep 17 00:03 allfiles.txt
-rw-r--r-- 1 paul paul  95K Sep 17 00:03 dmesg.txt
-rw-r--r-- 1 paul paul  20K Sep 17 00:04 services
drwxr-xr-x 2 paul paul 4.0K Sep 17 00:04 stuff
-rw-r--r-- 1 paul paul    0 Sep 17 00:04 summer.txt
paul@debian8:~$

8.6. mkdir

浏览Unix文件树固然有趣,创建自己的文件夹则更有意思,那就用命令mkdirmkdir后面至少跟着一个参数,就是新文件夹的名字。mkdir后面跟/开头的文件夹的时候请三思(注:有可能遇到权限问题,最好先通过cd命令切换到你的home目录)。

paul@debian8:~$ mkdir mydir
paul@debian8:~$ cd mydir
paul@debian8:~/mydir$ ls -al
total 8
drwxr-xr-x  2 paul paul 4096 Sep 17 00:07 .
drwxr-xr-x 48 paul paul 4096 Sep 17 00:07 ..
paul@debian8:~/mydir$ mkdir stuff
paul@debian8:~/mydir$ mkdir otherstuff
paul@debian8:~/mydir$ ls -l
total 8
drwxr-xr-x 2 paul paul 4096 Sep 17 00:08 otherstuff
drwxr-xr-x 2 paul paul 4096 Sep 17 00:08 stuff
paul@debian8:~/mydir$

8.6.1. mkdir -p

由于threedirsdeep的父文件夹并不存在,下面的命令会执行失败。

paul@debian8:~$ mkdir mydir2/mysubdir2/threedirsdeep
mkdir: cannot create directory ‘mydir2/mysubdir2/threedirsdeep’: No such file or directory

但是mkdir加上-p参数能确保同时创建父文件夹。

paul@debian8:~$ mkdir -p mydir2/mysubdir2/threedirsdeep
paul@debian8:~$ cd mydir2
paul@debian8:~/mydir2$ ls -l
total 4
drwxr-xr-x 3 paul paul 4096 Sep 17 00:11 mysubdir2
paul@debian8:~/mydir2$ cd mysubdir2
paul@debian8:~/mydir2/mysubdir2$ ls -l
total 4
drwxr-xr-x 2 paul paul 4096 Sep 17 00:11 threedirsdeep
paul@debian8:~/mydir2/mysubdir2$ cd threedirsdeep/
paul@debian8:~/mydir2/mysubdir2/threedirsdeep$ pwd
/home/paul/mydir2/mysubdir2/threedirsdeep

8.7. rmdir

rmdir可以移除一个空文件夹。

paul@debian8:~/mydir$ ls -l
total 8
drwxr-xr-x 2 paul paul 4096 Sep 17 00:08 otherstuff
drwxr-xr-x 2 paul paul 4096 Sep 17 00:08 stuff
paul@debian8:~/mydir$ rmdir otherstuff
paul@debian8:~/mydir$ cd ..
paul@debian8:~$ rmdir mydir
rmdir: failed to remove ‘mydir’: Directory not empty
paul@debian8:~$ rmdir mydir/stuff
paul@debian8:~$ rmdir mydir
paul@debian8:~$

8.7.1. rmdir -p

如命令mkdir的-p参数,可以一次性创建多层文件夹,rmdir -p则可以一次性移除多层文件夹。

paul@debian8:~$ mkdir -p test42/subdir
paul@debian8:~$ rmdir -p test42/subdir
paul@debian8:~$

8.8. 练习:文件夹

1.打出你当前文件夹路径。

2.切换到/etc目录下。

3.敲击键盘3下,切换到你的home目录。

4.敲击键盘11下切换到/boot/grub

5.切换到当前目录父目录。

6.切换到根目录。

7.列出根目录下面的内容。

8.列出根目录下面的详细信息。

9.待在根目录,列出/etc下的内容。

10.待在根目录,列出/bin/sbin下的内容。

11.待在根目录,列出~下面的内容。

12.列出home目录下面的所有文件(包括隐藏文件)。

13.以人类可读的形式列出/boot下的内容。

14.在你的home下创建文件夹testdir

15.切换到/etc,然后在你的home下创建一个新文件夹。

16.一个命令创建三层文件夹~/dir1/dir2/dir3

17.移除之前穿件的文件夹testdir

18.如果时间充裕(或者你在等其他的学生完成练习),学会使用命令pushdpopdman bash可以获得相关信息。

8.9. 答案:文件夹

1.打出你当前文件夹路径。

pwd

2.切换到/etc目录下。

cd /etc

3.敲击键盘3下,切换到你的home目录。

cd (and the enter key)

4.敲击键盘11下切换到/boot/grub

cd /boot/grub (use the tab key)

5.切换到当前目录父目录。

cd .. (with space between cd and ..)

6.切换到根目录。

cd /

7.列出根目录下面的内容。

ls

8.列出根目录下面的详细信息。

ls -l

9.待在根目录,列出/etc下的内容。

ls /etc

10.待在根目录,列出/bin/sbin下的内容。

ls /bin /sbin

11.待在根目录,列出~下面的内容。

ls ~

12.列出home目录下面的所有文件(包括隐藏文件)。

ls -al ~

13.以人类可读的形式列出/boot下的内容。

ls -lh /boot

14.在你的home下创建文件夹testdir

mkdir ~/testdir

15.切换到/etc,然后在你的home下创建一个新文件夹。

cd /etc ; mkdir ~/newdir

16.一个命令创建三层文件夹~/dir1/dir2/dir3

mkdir -p ~/dir1/dir2/dir3

17.移除之前穿件的文件夹testdir

rmdir testdir

18.如果时间充裕(或者你在等其他的学生完成练习),学会使用命令pushdpopdman bash可以获得相关信息。

man bash           # opens the manual
/pushd             # searches for pushd
n                  # next (do this two/three times)

bash有两个内建的命令pushdpopd。这两个命令维护一个共同的下压栈。pushd添加一个文件夹到栈里面,并且切换到添加的文件夹下面。popd则从栈上移除最后被添加的文件夹,然后切换到被移除的文件夹下面。

paul@debian7:/etc$ cd /bin
paul@debian7:/bin$ pushd /lib
/lib /bin
paul@debian7:/lib$ pushd /proc
/proc /lib /bin
paul@debian7:/proc$ popd
/lib /bin
paul@debian7:/lib$ popd
/bin

注:

1.本文由Program Dog翻译自 http://linux-training.be

2.本文原始链接:https://program-dog.blogspot.com/2016/11/linux-fun-char08-working-with-directories.html


2 条评论 :

  1. 博主好用心啊!这些确实是基础中的基础。非常适合初学者,支持支持!

    回复删除