shell编程之基本bash命令

Posted 射手座IT俱乐部

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell编程之基本bash命令相关的知识,希望对你有一定的参考价值。

今天谈一下文件处理相关知识和命令:

  • 创建文件命令

  • 文件重命名

  • 链接文件命令




创建文件命令
我们经常用到的一个命令是touch:

# touch test1
# ls -al
total 0
drwxrwxrwx 1 vagrant vagrant 0 Aug 31 06:54 .
drwxrwxrwx 1 vagrant vagrant 0 Aug 31 06:54 ..
-rwxrwxrwx 1 vagrant vagrant 0 Aug 31 06:54 test1

touch命令创建了一个大小为0字节的文件。
另外,touch命令可以改变文件的修改时间。

# echo 'just a test' > test1
# more test1 
just a test
# touch test1
# ls -al
total 1
drwxrwxrwx 1 vagrant vagrant  0 Aug 31 06:57 .
drwxrwxrwx 1 vagrant vagrant  0 Aug 31 06:54 ..
-rwxrwxrwx 1 vagrant vagrant 12 Aug 31 06:59 test1
# more test1
just a test

上面的命令是写入文字在test1中。查看test1 的内容。修改test1 的修改时间。查看修改时间。查看test1 的内容。

这说明:touch 命令改变文件的修改时间,但并不改变文件的内容。

当然,如果我们仅仅要改变文件的访问时间,可以用参数a。

# ls -al  test1
-rwxrwxrwx 1 vagrant vagrant 12 Aug 31 06:59 test1
# ls -al --time=atime test1 
-rwxrwxrwx 1 vagrant vagrant 12 Aug 31 06:59 test1
# touch -a test1
# ls -al  test1
-rwxrwxrwx 1 vagrant vagrant 12 Aug 31 06:59 test1
# ls -al --time=atime test1
-rwxrwxrwx 1 vagrant vagrant 12 Aug 31 07:07 test1

ls -al —time=atime的作用是查看文件的访问时间。



文件重命名

一般而言,在linux重命名文件,我们使用的是mv(moving)命令,也就是移动。当然mv命令除了重命名以外,可以将文件或目录移动到另外一个位置。

# ls -al
total 1
drwxrwxrwx 1 vagrant vagrant  0 Aug 31 07:14 .
drwxrwxrwx 1 vagrant vagrant  0 Aug 31 06:54 ..
-rwxrwxrwx 1 vagrant vagrant 18 Aug 31 07:15 test1
# mv test1 test2
# ls -al
total 1
drwxrwxrwx 1 vagrant vagrant  0 Aug 31 07:20 .
drwxrwxrwx 1 vagrant vagrant  0 Aug 31 06:54 ..
-rwxrwxrwx 1 vagrant vagrant 18 Aug 31 07:15 test2

这里是将test1重命名为test2。
不过在这期间,文件的时间戳没有变化。也就是说mv只影响了文件名。
再来一个mv移动文件位置的例子:

# ls -alF  (查看当前文件夹的内容)
total 1
drwxrwxrwx 1 vagrant vagrant  0 Aug 31 07:23 ./
drwxrwxrwx 1 vagrant vagrant  0 Aug 31 06:54 ../
drwxrwxrwx 1 vagrant vagrant  0 Aug 31 07:23 amove/
-rwxrwxrwx 1 vagrant vagrant 18 Aug 31 07:15 test2*
# mv test2 ./amove/    (移动文件test2到amove中)
# ls -alF  (再次查看当前文件夹的内容)
total 0
drwxrwxrwx 1 vagrant vagrant 0 Aug 31 07:24 ./
drwxrwxrwx 1 vagrant vagrant 0 Aug 31 06:54 ../
drwxrwxrwx 1 vagrant vagrant 0 Aug 31 07:24 amove/
# ls -alF amove/  (再次查看amove文件夹的内容)
total 1
drwxrwxrwx 1 vagrant vagrant  0 Aug 31 07:24 ./
drwxrwxrwx 1 vagrant vagrant  0 Aug 31 07:24 ../
-rwxrwxrwx 1 vagrant vagrant 18 Aug 31 07:15 test2*

当然要出现重名文件,需要提示时,可以使用i参数。

# ls -alF amove/  (查看amove文件夹的内容)
total 1
drwxrwxrwx 1 vagrant vagrant  0 Aug 31 07:24 ./
drwxrwxrwx 1 vagrant vagrant  0 Aug 31 07:24 ../
-rwxrwxrwx 1 vagrant vagrant 18 Aug 31 07:15 test2*
# touch test2 (新建test2在test文件夹下)
# mv test2 amove/  (移动test2到amove中,没有任何提示进行了移动)
# ls -alF amove/  (再次查看amove文件的内容)
total 0
drwxrwxrwx 1 vagrant vagrant 0 Aug 31 07:27 ./
drwxrwxrwx 1 vagrant vagrant 0 Aug 31 07:27 ../
-rwxrwxrwx 1 vagrant vagrant 0 Aug 31 07:27 test2*
# more amove/test2 (test2 已经被替换,而没有提示)
# touch test2 (重新建立一个test2文件在test文件夹下)
# echo 'this is a test !' > test2 (写入文件内容)
# mv -i test2 amove/  (加参数i,移动文件重名时进行提示)
mv: overwrite 'amove/test2'? y  (出现提示,我们选择覆盖)
# more amove/test2 (查看新文件你的内容)
this is a test !

当然,我们可以重命名和移动一气呵成。

# mv amove/test2 ./test1
# ls -al
total 1
drwxrwxrwx 1 vagrant vagrant  0 Aug 31 07:35 .
drwxrwxrwx 1 vagrant vagrant  0 Aug 31 06:54 ..
drwxrwxrwx 1 vagrant vagrant  0 Aug 31 07:35 amove
-rwxrwxrwx 1 vagrant vagrant 17 Aug 31 07:31 test1  (test2移动后被改名为test1)
# ls -al amove
total 0
drwxrwxrwx 1 vagrant vagrant 0 Aug 31 07:35 .
drwxrwxrwx 1 vagrant vagrant 0 Aug 31 07:35 ..
# more test1
this is a test !

当然我们可以移动整个文件夹和内容,使用方式如下:

# ls -al
total 0
drwxrwxrwx 1 vagrant vagrant 0 Aug 31 07:40 .
drwxrwxrwx 1 vagrant vagrant 0 Aug 31 06:54 ..
drwxrwxrwx 1 vagrant vagrant 0 Aug 31 07:39 amove
drwxrwxrwx 1 vagrant vagrant 0 Aug 31 07:40 bmove
# ls -alF amove
total 1
drwxrwxrwx 1 vagrant vagrant  0 Aug 31 07:39 ./
drwxrwxrwx 1 vagrant vagrant  0 Aug 31 07:40 ../
-rwxrwxrwx 1 vagrant vagrant 17 Aug 31 07:31 test1*
# ls -alF bmove
total 0
drwxrwxrwx 1 vagrant vagrant 0 Aug 31 07:40 ./
drwxrwxrwx 1 vagrant vagrant 0 Aug 31 07:40 ../
# mv amove/ bmove/
# ls -alF
total 0
drwxrwxrwx 1 vagrant vagrant 0 Aug 31 07:40 ./
drwxrwxrwx 1 vagrant vagrant 0 Aug 31 06:54 ../
drwxrwxrwx 1 vagrant vagrant 0 Aug 31 07:40 bmove/
# ls -alF bmove/
total 0
drwxrwxrwx 1 vagrant vagrant 0 Aug 31 07:40 ./
drwxrwxrwx 1 vagrant vagrant 0 Aug 31 07:40 ../
drwxrwxrwx 1 vagrant vagrant 0 Aug 31 07:39 amove/
# ls bmove/amove/ -alF
total 1
drwxrwxrwx 1 vagrant vagrant  0 Aug 31 07:39 ./
drwxrwxrwx 1 vagrant vagrant  0 Aug 31 07:40 ../
-rwxrwxrwx 1 vagrant vagrant 17 Aug 31 07:31 test1*

当然你要将整个文件夹重命名也是可以的:

# mv bmove/ amove


链接文件命令

采用保存一份物理文件副本和多个虚拟副本的方法,这种虚拟的副本我们称之为链接 。链接是目录中指向文件真实位置的占位符。

在Linux中我们可以见到两种不同类型的文件链接:

  • 符号(软)链接:
    类似于Windows中对应的快捷方式,删除符号链接不影响源文件,删除源文件,则对应的符号链接也没有意义了。
    示例:

    # touch mytest (新建mytest文件)
    # echo "oh oh oh" >mytest (写入内容)
    # more mytest  (显示内容)
    oh oh oh
    # ln -s mytest sl_mytest (建立软链接)
    # ls -al  (显示信息)
    total 1
    drwxrwxrwx 1 vagrant vagrant 0 Aug 31 08:34 .
    drwxrwxrwx 1 vagrant vagrant 0 Aug 31 06:54 ..
    -rwxrwxrwx 1 vagrant vagrant 9 Aug 31 08:34 mytest
    lrwxrwxrwx 1 vagrant vagrant 0 Aug 31 08:34 sl_mytest -> mytest  (sl_mytest软链接指向mytest)

    要为文件mytest创建符号链接,原始文件mytest必须事先存在。然后可以使用ln 命令以及-s 选项来创建符号链接。
    符号链接的文件大小与数据文件的文件大小不同。

    # more sl_mytest 
    oh oh oh
    # more mytest 
    oh oh oh

    这样看的话,more命令看到的文件内容是相同的。但是其实more打开的是mytest文件,我们使用ls -i查看inode编号:

    # ls -ial
    total 1
    115 drwxrwxrwx 1 vagrant vagrant 0 Aug 31 08:34 .
    ? drwxrwxrwx 1 vagrant vagrant 0 Aug 31 06:54 ..
    131 -rwxrwxrwx 1 vagrant vagrant 9 Aug 31 08:34 mytest
    132 lrwxrwxrwx 1 vagrant vagrant 0 Aug 31 08:34 sl_mytest -> mytest

    说明它们是两个完全不同的文件。我们只要用ls -l命令就可以明显看出软链接的指向,从而判断是链接文件了。

  • 硬链接
    会创建独立的虚拟文件,其中包含了原始文件的信息及位置。但是它们从根本上而言是同一个文件。引用硬链接文件等同于引用了源文件。要创建硬链接,原始文件也必须事先存在,只不过这次使用ln 命令时不再需要加入额外的参数了。

    # ln mytest hl_mytest
    # ls -il
    total 8
    6563 -rw-r--r-- 2 root root 9 Aug 31 08:48 hl_mytest
    6563 -rw-r--r-- 2 root root 9 Aug 31 08:48 mytest
    8015 lrwxrwxrwx 1 root root 6 Aug 31 08:49 sl_mytest -> mytest
    # more sl_mytest 
    oh oh oh
    # more mytest 
    oh oh oh
    # more hl_mytest 
    oh oh oh

    这里,我们建立了硬链接hl_mytest,内容相同。如果我改变hl_mytest的内容,原来文件mytest的内容也将随之改变。示例:

    # more mytest 
    oh oh oh
    # echo "my godmore" >> hl_mytest 
    # more hl_mytest 
    oh oh oh
    my godmore
    # more mytest 
    oh oh oh
    my godmore
    # more sl_mytest 
    oh oh oh
    my godmore
    # ls -ial *mytest
    6563 -rw-r--r-- 2 root root 20 Aug 31 08:53 hl_mytest
    6563 -rw-r--r-- 2 root root 20 Aug 31 08:53 mytest
    8015 lrwxrwxrwx 1 root root  6 Aug 31 08:49 sl_mytest -> mytest

    如果我删除了mytest文件会有什么变化呢?示例:

    #rm -rf mytest (删除mytest文件)
    # ls -ial *mytest
    6563 -rw-r--r-- 1 root root 20 Aug 31 08:53 hl_mytest
    8015 lrwxrwxrwx 1 root root  6 Aug 31 08:49 sl_mytest -> mytest
    # more sl_mytest 
    more: stat of sl_mytest failed: No such file or directory (出现了错误信息)
    # more hl_mytest (hl_mytest信息依旧)
    oh oh oh
    my godmore

    一般硬链接在对保护文件方面有重要作用。文件不至于因为误删而丢失。





转载请注明出处。
了解更多,请关注我们的微信公众号:
射手座IT俱乐部


以上是关于shell编程之基本bash命令的主要内容,如果未能解决你的问题,请参考以下文章

shell编程之基本bash命令

shell编程之基本bash命令

Linux之shell编程的基本使用

Bash脚本之ifcaseread和位置参数

Shell编程Shell中Bash基本功能

Shell编程Shell中Bash基本功能