Linux:文件系统基础命令扫盲

目录

查看目录下的文件

创建目录文件

删除目录文件

打印当前工作目录

切换工作目录

删除文件

复制文件或目录

移动文件或目录

创建文件


????主页:R6bandito_

 ✈往期:《Linux与Windows文件共享》

查看目录下的文件

命令:ls (list):

        显示指定目录中的文件或子目录

ls [参数] [路径信息]

示例:列出根目录下所有文件及子目录

youdingsong@ubuntu:/$ ls 
bin  boot  dev  etc  home  lib  lost+found  media  mnt  opt  proc  root  run  sbin  selinux  srv  sys  tmp  usr  var
youdingsong@ubuntu:/$ 

不使用任何参数且采用默认路径,则默认列出当前所处工作目录的文件及其子目录

我们使用man手册列出ls命令的帮助信息如下:

可以看到其可调用的参数是十分多的,在此处我们不一一列举。命令行参数可以叠加配合使用,如下所示:

youdingsong@ubuntu:~$ ls -alh 
#此处,alh便为三个不同的参数。其功能见文章下述。

接下来介绍几个ls常用的且比较重要的命令行参数:

  • -a(all): man手册原文:

do not ignore entries starting with .

不忽略以 . 开头的隐藏文件

例如我们来到家目录,使用ls列出其下文件:

youdingsong@ubuntu:~$ ls
Documentary

可以看到其中只有一个子目录:Documentary。现在我们使用 -a参数,来列出家目录下文件:

youdingsong@ubuntu:~$ ls -a
.  ..  .bash_history  .bash_logout  .bashrc  Documentary  .oh-my-zsh  .profile  .sudo_as_admin_successful  .viminfo  .zshrc
youdingsong@ubuntu:~$ 

        现在我们一并将其中的隐藏文件全部列了出来。这些文件在默认情况下是不会显示的,无论是在图形界面还是命令行界面。

  • -l(long):man手册原文:

use a long listing format

使用长格式进行打印显示

例如我们在家目录下,调用此命令:

youdingsong@ubuntu:~$ ls -al
total 44
drwxr-x--- 4 youdingsong youdingsong 4096 Oct 12 20:11 .
drwxr-xr-x 3 root        root        4096 Oct 12 16:48 ..
-rw------- 1 youdingsong youdingsong  948 Oct 12 17:35 .bash_history
-rw-r--r-- 1 youdingsong youdingsong  220 Oct 10 20:48 .bash_logout
#部分结果如上

可以看到该命令将文件的详细信息和属性打印了出来。这里我们来识读一下所打印信息的含义:

  • 红框第一列:该列中d代表该文件为目录文件(即目录), -代表该文件为文件系统的一个普通文件。 若为l则代表该文件为一个软链接

  • 蓝框中每行的9位数据为文件的权限部分:从左至右每三位为一组,分别为

    文件所有者 文件所有者所在组 其它人

    所对应的权限有:r (read 可读),w (write 可写),x (execute 可执行)。 这里以第二行数据的权限为例:

drwxr-xr-x
rwx:文件的所有者拥有  可读  可写  可执行 权限
r-x:文件所有者所在组拥有	可读	可执行 权限 (无可写权限)
r-x:其它人拥有	可读	可执行	权限

  • 绿框列:为该文件的硬链接数目。

  • 黄框:为文件的所有者以及文件所有者的组。这里我们可以看到,..文件的所有者与所有者的组均为root(注:...均为文件)。

  • 棕色框:文件的大小。

  • 玫瑰色框:文件最近的一次修改时间。

  • 白色框:文件名称。

  • -h(human readable):man手册原文:

with -l and -s, print sizes like 1K 234M 2G etc.

-l-s等参数配合使用,以人类易读的方式显示出文件的大小。在家目录下执行此命令:

youdingsong@ubuntu:~$ ls -lh
total 4.0K
drwxrwxr-x 2 youdingsong youdingsong 4.0K Oct 10 21:10 Documentary

 与之前进行对比,可以看到文件大小的显示格式已经变为了常用的以K,M,Gb等常用易读格式。

  • -t(sort by time):man手册原文:

sort by time, newest first; see --time

根据文件所修改的时间进行排序。最近修改的文件排在前面。在家目录下执行下列命令:

youdingsong@ubuntu:~$ ls -alht
total 44K
drwxr-x--- 4 youdingsong youdingsong 4.0K Oct 12 21:03 .
-rw------- 1 youdingsong youdingsong   20 Oct 12 21:03 .lesshst
-rw------- 1 youdingsong youdingsong 1.1K Oct 12 20:50 .bash_history
drwxr-xr-x 3 root        root        4.0K Oct 12 16:48 ..
drwxrwxr-x 2 youdingsong youdingsong 4.0K Oct 10 21:10 Documentary
-rw------- 1 youdingsong youdingsong  888 Oct 10 21:10 .viminfo
…………
youdingsong@ubuntu:~$

可以看到,时间最新的已经排到了第一列,并顺次往下延,越往后文件最近的一次修改时间据现在越长。

关于ls更多的参数,可以参考man手册进行使用。


创建目录文件

命令:mkdir(make directory)

        创建一个目录文件

mkdir [参数] directory_name

示例:在家目录下创建新目录文件 Test_dir。

youdingsong@ubuntu:~$ mkdir Test_dir
youdingsong@ubuntu:~$ ls
Documentary  Test_dir

可以看到家目录下已经新创建了一个空目录。mkdir命令常用参数如下:

  • -p(parents):man手册原文:

no error if existing, make parent directories as needed

如果父目录不存在,则会创建父目录。这也就是所谓的递归创建目录。

例如:

youdingsong@ubuntu:~$ mkdir -p Test_dir/dir1/dir2/dir3
youdingsong@ubuntu:~$ tree Test_dir/
Test_dir/
└── dir1
    └── dir2
        └── dir3

3 directories, 0 files

我们向Test_dir目录文件中又继续创建了子目录,子目录下又有子目录。

  • -m(mode):man手册原文:

set file mode (as in chmod)

        正如chmod命令一样,创建目录文件并向其赋予指定权限。

        例如我们在家目录下创建一个新目录new_dir。并将其权限设置为 rwx rwx rwx(注:此处不能使用文字法来设定权限,只能使用数字法!)

youdingsong@ubuntu:~$ mkdir -m 777 new_dir
youdingsong@ubuntu:~$ ls -l
total 12
drwxrwxr-x 6 youdingsong youdingsong 4096 Oct 13 10:04 Documentary
drwxrwxrwx 2 youdingsong youdingsong 4096 Oct 13 11:12 new_dir
drwxrwxr-x 3 youdingsong youdingsong 4096 Oct 13 11:03 Test_dir
youdingsong@ubuntu:~$ 

可以看到,所创建的new_dir已经被赋予了所指定的权限。


删除目录文件

命令:rmdir(remove empty directory)

        删除一个目录

rmdir [参数] [路径信息]

例如删除掉之前所创建的new_dir文件:

youdingsong@ubuntu:~$ rmdir new_dir
youdingsong@ubuntu:~$ ls
Documentary  Test_dir

该命令用于删除目录,但是只能删除空目录文件。对于非空目录文件是无法使用rmdir进行操作的。

youdingsong@ubuntu:~$ tree Test_dir/
Test_dir/
├── dir1
│   └── dir2
│       └── dir3
└── main.c

3 directories, 1 file
youdingsong@ubuntu:~$ rmdir Test_dir
rmdir: failed to remove 'Test_dir': Directory not empty

Test_dir目录非空,对其使用rmdir命令报错。

  • 参数-p(parents):man手册原文:

remove DIRECTORY and its ancestors;

删除目录及其上级。假设我们现在有如下目录结构:

youdingsong@ubuntu:~$ tree test/
test/
└── hello
    └── this
        └── is
            └── linux

4 directories, 0 files

我们想要删除整个test目录及其子孙目录。执行如下命令:

youdingsong@ubuntu:~$ rmdir test
rmdir: failed to remove 'test': Directory not empty

很明显,直接这样做是行不通的,rmdir并不能删除非空目录文件。我们换个思路,由内而外依次删除试试看:

youdingsong@ubuntu:~$ rmdir test/hello/this/is/linux/
youdingsong@ubuntu:~$ tree test/
test/
└── hello
    └── this
        └── is

3 directories, 0 files

可以看到命令已经成功执行,但是只删除了最内层的空的子目录,并未达到我们的预期目标。

接下来我们采用-p参数进行执行:

youdingsong@ubuntu:~$ rmdir -p test/hello/this/is/
youdingsong@ubuntu:~$ ls
Documentary  Test_dir

可以看到连同最初的父目录在内(test)一并被删除了。

(注:同样只能删除空目录,若路径的任一级目录文件中含有除路径信息所含目录之外的其它文件(哪怕是空目录) 均无法删除)。

后续还有rm删除命令也有删除目录文件的功能,其使用较rmdir命令更为常用,也更为方便。


打印当前工作目录

命令:pwd(print working directory)

        将当前所处的目录位置以绝对路径方式打印到终端。

最为常用的命令之一,也十分简单,不作过多赘述。示例:

youdingsong@ubuntu:~/Documentary/dir3$ pwd
/home/youdingsong/Documentary/dir3

切换工作目录

命令:cd(change directory)

        切换目前工作目录到所指定的位置

cd [路径参数]

可以使用绝对路径参数,例如从当前位置切换到/usr/lib目录下:

youdingsong@ubuntu:~$ pwd
/home/youdingsong
youdingsong@ubuntu:~$ cd /usr/lib #绝对路径参数
youdingsong@ubuntu:/usr/lib$ pwd
/usr/lib

可以使用相对路径参数,例如从家目录到家目录的子目录Documentary:

youdingsong@ubuntu:~$ cd Documentary/ #相对路径参数
youdingsong@ubuntu:~/Documentary$ 

去上一级目录(..):

youdingsong@ubuntu:/usr/lib$ cd ..
youdingsong@ubuntu:/usr$ pwd
/usr

回到家目录(~):

路径参数可以使用 ~,也可以不加任何路径参数(默认回到该用户的家目录)

youdingsong@ubuntu:/usr/lib$ cd
youdingsong@ubuntu:~$ pwd
/home/youdingsong

#二者是等价的

youdingsong@ubuntu:/usr/lib$ cd ~
youdingsong@ubuntu:~$ pwd
/home/youdingsong

退回(-):

        注意:这里不是返回上一级目录!是回到上次cd之前的目录。这个操作类似于如下图所示Windows中的返回操作

        在Windows中,这个操作相信大家不会陌生,我们linux中功能也是与其类似的,但是linux中的功能没有Windows中的强大。 在linux中,只进行一次记忆,因此对于退回操作也只能退回最近的一次。例如:

youdingsong@ubuntu:~$ cd /usr/lib
youdingsong@ubuntu:/usr/lib$ cd /bin
youdingsong@ubuntu:/bin$ cd -
/usr/lib
youdingsong@ubuntu:/usr/lib$ cd -
/bin

这里反复调用该命令(cd -)只会在 /bin/usr/lib两个目录之间来回切换,而并不会回到一开始的Home目录。这里我们使用env命令将环境配置打印到终端上

可以在下面看到如下句段:

OLDPWD=/usr/lib

这里就是存储cd - 命令所用的目录路径的位置,此处目录会随着 cd命令的调用而更改。也就是说,当我们执行cd -命令时,其实是将环境变量中的OLDPWD拿了出来替换掉了 ‘-’

youdingsong@ubuntu:/bin$ cd $OLDPWD #这里和cd - 命令二者等价
youdingsong@ubuntu:/usr/lib$ 

删除文件

命令:rm(remove files or directories)

        删除文件或目录。

rm [命令参数] [文件名及文件路径参数]

        在这里需要提前强调的是用rm删除文件是不可逆的。因此在删除文件之前应再三检查命令与要删除的文件是否匹配!

其次不要以root身份(或sudo) 来执行该命令,尤其是在执行递归删除时!可以考虑使用 trash-cli 等工具,将文件移动到回收站从而代替使用rm进行永久删除。

~/Documentary$ rm aaa.cpp #删除当前目录下的aaa.cpp文件

可一次性删除多个文件:

~/Documentary$ rm file1 file2 file4

常用参数:

  • -r(recursive):man手册原文:

remove directories and their contents recursively.

递归删除目录及内容

在默认情况下rm是无法删除目录的,但可以调用递归参数来对目录文件执行删除操作(该功能严禁在root和sudo条件下使用):

├── dir1
│   └── file1
:~/Documentary$ rm -r dir1 
  • -f(force):man手册原文:

ignore nonexistent files and arguments, never prompt.

强制进行删除,不接收任何的提示。常与r一起使用。

:~/Documentary$ rm -rf dir2
  • -i:man手册原文:

prompt before every removal.

执行每次删除之前进行确认。

        该命令在完全删除某文件之前会要求用户进行确认以防止误操作。但代价就是当递归删除某目录时若其内文件较多,则每个文件的删除都需要用户手动进行确认,我相信没人喜欢这种事情。        

        因此对于该命令不建议将其作为rm的别名,而是在某些特定场景下手动调用该参数。

:~/Documentary$ rm -ri dir3
rm: descend into directory 'dir3'? y
rm: remove regular empty file 'dir3/file2'? y
rm: remove regular empty file 'dir3/file1'? y
rm: descend into directory 'dir3/hello'? y
rm: remove regular empty file 'dir3/hello/file1'? y
rm: remove directory 'dir3/hello'? y
rm: remove directory 'dir3'? y
:~/Documentary$   #诺,看到了吧。
  • -I:man手册原文:

prompt once before removing more than three files, or when removing recursively.

在删除多个文件时将会对用户进行提示,而在删除单个文件时不会则不会提示。

对于多个文件的删除确认只提示一次,而不是像-i那样每个文件都需要确认一次。

:~/Documentary$ rm -I file1 file3  file4 test.cpp 
rm: remove 4 arguments? n
:~/Documentary$ ls
aaa.cpp  dir2  file1  file3  file4  test.cpp  test_file1  tet

复制文件或目录

命令:cp(copy files and directories)

cp [功能参数] 源文件 目标文件

用于复制文件或目录。示例如下:

:~/try$ ls
test.c
:~/try$ cp test.c obj.c
:~/try$ ls
obj.c  test.c #两份.c文件都是都是一样的

其常用功能参数如下:

  • -r(recursive):man手册原文:

copy directories recursively.

递归拷贝,用于复制目录及其内部的文件。

:~/Documentary$ cp dir2/ dirnew #默认无法拷贝目录
cp: -r not specified; omitting directory 'dir2/'
:~/Documentary$ cp -r dir2/ dirnew #递归拷贝
:~/Documentary$ ls
aaa.cpp  dir2  dirnew  file1  file3  file4  plus.cpp  test.cpp  test_file1  tet
  • -i(interactive):man手册原文:

prompt before overwrite.

        交互模式,在执行拷贝前进行确认

        cp命令的逻辑是:若目标文件不存在则新建,若目标文件存在则覆盖。因此为了防止误操作(错误操作导致文件被覆盖)。建议将该模式作为其cp的别名进行使用。

:~$ ls
Documentary  hello  share  te.cpp  Test_dir  try #try中有一个test.cpp
:~$ cp -i te.cpp try/test.cpp #若不使用-i则会直接进行覆盖而不会提示
cp: overwrite 'try/test.cpp'? n
  • -u(update):man手册原文:

copy only when the SOURCE file is newer than the destination file or when the destination file is missing.

仅当源文件比目标文件新或目标文件不存在时执行拷贝操作。

    Oct 23 21:02 newest
    Oct 20 15:27 test.cpp
:~/Documentary$ cp -u test.cpp newest 
:~/Documentary$ ls -al
-rw-rw-r--  1 youdingsong youdingsong    0 Oct 23 21:02 newest

可以看到文件test.cpp比newest旧,此处执行-u命令,命令虽然是被成功执行了的,但是覆盖并未成功,可以看到newest文件大小仍为0.

而当我们不使用-u重新执行操作时:

:~/Documentary$ cp -i test.cpp newest 
cp: overwrite 'newest'? y
:~/Documentary$ ls -l
 Oct 23 21:08 newest 

可以看到文件newest文件大小已被更改,原来较新的空文件已被覆盖。

  • -a(archive):man手册原文:

same as -dR.

归档模式,复制文件及其属性(包括文件权限以及符号链接)。适合用于备份。


移动文件或目录

命令:mv(move)

mv [功能参数] 源文件 目标文件

用于移动文件或目录,也可以重命名目录和文件,相当于Windows的剪切功能。

:~/Documentary$ ls
aaa.cpp  dir2  dirnew  file1  file2  file3  file4  
:~/Documentary$ mv file2 file1 .. #将file1 与 file2移动至上级目录
:~/Documentary$ ls
aaa.cpp  dir2  dirnew  file3  file4 

常用参数如下:

  • -i(interactive):man手册原文:

prompt before overwrite.

cp命令一样,mv同样存在文件覆盖的问题,可以使用该交互参数来对用户进行确认提示。

:~/Documentary$ mv -i file1 ..
mv: overwrite '../file1'? n
:~/Documentary$ 
  • -u(update):该参数与cp命令中的参数一样,此处不再重复给出。

        Linux里没有专门用于重命名的命令,可以使用mv命令移动到原来的目录下即可实现重命名。

:~/Documentary/tet$ ls
file1
:~/Documentary/tet$ mv file1 newname
:~/Documentary/tet$ ls
newname

 Tips:如果目标文件与源文件的文件名及文件路径相同,mv 命令将不会做任何操作。


创建文件

命令:touch

touch [功能参数] 文件名

创建空文件,或更新现有文件的时间戳。

        说来有趣,touch命令从其字面意思来看似乎跟创建(create)沾不上一点关系。touch命令的本意是更新文件的时间戳(也就是假装touch了一下文件,将文件的修改时间戳更至最新)。

        后来有人发现touch的副作用是:当用户touch一个不存在的文件时会创建出一个新文件,后来便一发不可收拾,成为了一个最为广泛好用的创建新文件的方法。

:~/Documentary/tet$ ls
newname
:~/Documentary/tet$ touch newfile
:~/Documentary/tet$ ls
newfile  newname

touch一个不存在的文件会创建新文件,touch一个已经存在的文件会更新其时间戳。

touch也有自身的功能参数,但是使用频率都不高,此处便不再给出具体语句示例。

  • -c:如果文件不存在,则不创建新文件。

  • -d:使用指定的日期和时间。

touch -d "2024-10-23 12:00:00" filename.txt

  • -a:仅更新访问时间。

  • -m:仅更新修改时间。


                        ????????????o(* ̄▽ ̄*)ブ

上一篇:【Orange Pi 5 Linux 5.x 内核编程】-字符设备文件操作基础


下一篇:【WIN】WIN10_WSL_Ubuntu18.04_ROS_rviz_docker-图形化显示