Sandra Henry-Stocker 发布的文章

从 Linux 系统的存档中提取文件没有拔牙那么痛苦,但有时看起来更复杂。在这篇文章中,我们将看看如何轻松地从 Linux 系统中可能遇到的几乎所有类型的存档中提取文件。

它们有很多格式,从 .gz 到 .tbz2,这些文件的命名方式都各有一些不同。当然,你可以记住所有从存档中提取文件的各种命令以及它们的选项,但是你也可以将所有经验保存到脚本中,而不再担心细节。

在本文中,我们将一系列提取命令组合成一个脚本,它会调用适当的命令根据文档名提取文件的内容。该脚本首先以一些命令来验证是否已经提供了一个文件名作为参数,或要求运行脚本的人提供文件名。

#!/bin/bash

if [ $# -eq 0 ]; then
    echo -n "filename> "
    read filename
else
    filename=$1
fi

if [ ! -f "$filename" ]; then
    echo "No such file: $filename"
    exit $?
fi

了解了么?如果未提供任何参数,脚本将提示输入文件名,如果存在则使用它。然后,它验证文件是否实际存在。如果不是,那么脚本退出。

下一步是使用 bash 的 case 语句根据存档文件的名称调用适当的提取命令。对于其中某些文件类型(例如 .bz2),也可以使用除 tar 之外的其它命令,但是对于每种文件命名约定,我们仅包含一个提取命令。因此,这是带有各种存档文件名的 case 语句:

 case $filename in
    *.tar)      tar xf $filename;;
    *.tar.bz2)  tar xjf $filename;;
    *.tbz)      tar xjf $filename;;
    *.tbz2)     tar xjf $filename;;
    *.tgz)      tar xzf $filename;;
    *.tar.gz)   tar xzf $filename;;
    *.gz)       gunzip $filename;;
    *.bz2)      bunzip2 $filename;;
    *.zip)      unzip $filename;;
    *.Z)        uncompress $filename;;
    *)          echo "No extract option for $filename"
esac

如果提供给脚本的文件扩展名与脚本已知的扩展名都不匹配,那么会发出 “No extract option for $filename” 的消息。如果缺少你使用的任何存档类型,只需将它们与所需的提取命令一起添加即可。

将 bash 头添加到脚本顶部,使其可执行,然后就可以开始了。

#!/bin/bash

if [ $# -eq 0 ]; then
    echo -n "filename> "
    read filename
else
    filename=$1
fi

if [ ! -f "$filename" ]; then
    echo "No such file: $filename"
    exit $?
fi

case $filename in
    *.tar)      tar xf $filename;;
    *.tar.bz2)  tar xjf $filename;;
    *.tbz)      tar xjf $filename;;
    *.tbz2)     tar xjf $filename;;
    *.tgz)      tar xzf $filename;;
    *.tar.gz)   tar xzf $filename;;
    *.gz)       gunzip $filename;;
    *.bz2)      bunzip2 $filename;;
    *.zip)      unzip $filename;;
    *.Z)        uncompress $filename;;
    *.rar)      rar x $filename ;;
    *)

如果你希望脚本在提取文件时显示内容,请将详细选项(-v)添加到每个命令参数字符串中:

#!/bin/bash

if [ $# -eq 0 ]; then
    echo -n "filename> "
    read filename
else
    filename=$1
fi

if [ ! -f "$filename" ]; then
    echo "No such file: $filename"
    exit $?
fi

case $filename in
    *.tar)      tar xvf $filename;;
    *.tar.bz2)  tar xvjf $filename;;
    *.tbz)      tar xvjf $filename;;
    *.tbz2)     tar xvjf $filename;;
    *.tgz)      tar xvzf $filename;;
    *.tar.gz)   tar xvzf $filename;;
    *.gz)       gunzip -v $filename;;
    *.bz2)      bunzip2 -v $filename;;
    *.zip)      unzip -v $filename;;
    *.Z)        uncompress -v $filename;;
    *)          echo "No extract option for $filename"
esac

总结

虽然可以为每个可能用到的提取命令创建别名,但是让脚本为遇到的每种文件类型提供命令要比自己停下来编写每个命令和选项容易。


via: https://www.networkworld.com/article/3564265/painless-file-extraction-on-linux.html

作者:Sandra Henry-Stocker 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

如果你想了解 Linux 服务器在重压之下的运行情况,那么给 Linux 服务器施加压力是个不错的主意。在这篇文章中,我们将看一些工具,可以帮助你增加服务器压力并衡量结果。

为什么你会想给你的 Linux 系统施加压力呢?因为有时你可能想知道当一个系统由于大量运行的进程、繁重的网络流量、过多的内存使用等原因而承受很大的压力时,它的表现如何。这种压力测试可以帮助确保系统已经做好了 “上市” 的准备。

如果你需要预测应用程序可能需要多长时间才能做出反应,以及哪些(如果有的话)进程可能会在重负载下失败或运行缓慢,那么在前期进行压力测试是一个非常好的主意。

幸运的是,对于那些需要能够预测 Linux 系统在压力下的反应的人来说,你可以采用一些有用的技术和工具来使这个过程更容易。在这篇文章中,我们将研究其中的一些。

自己动手做个循环

第一种技术是在命令行上运行一些循环,观察它们对系统的影响。这种方式可以大大增加 CPU 的负荷。使用 uptime 或类似的命令可以很容易地看到结果。

在下面的命令中,我们启动了四个无尽循环。你可以通过添加数字或使用 bash 表达式,如 {1...6} 来代替 1 2 3 4 以增加循环次数:

for i in 1 2 3 4; do while : ; do : ; done & done

在命令行上输入后,将在后台启动四个无尽循环:

$ for i in 1 2 3 4; do while : ; do : ; done & done
[1] 205012
[2] 205013
[3] 205014
[4] 205015

在这种情况下,发起了作业 1-4,作业号和进程号会相应显示出来。

要观察对平均负载的影响,请使用如下所示的命令。在本例中,uptime 命令每 30 秒运行一次:

$ while true; do uptime; sleep 30; done

如果你打算定期运行这样的测试,你可以将循环命令放入脚本 watch-it 中。

#!/bin/bash

while true
do
  uptime
  sleep 30
done

在输出中,你可以看到平均负载是如何增加的,然后在循环结束后又开始下降。

 11:25:34 up 5 days, 17:27,  2 users,  load average: 0.15, 0.14, 0.08
 11:26:04 up 5 days, 17:27,  2 users,  load average: 0.09, 0.12, 0.08
 11:26:34 up 5 days, 17:28,  2 users,  load average: 1.42, 0.43, 0.18
 11:27:04 up 5 days, 17:28,  2 users,  load average: 2.50, 0.79, 0.31
 11:27:34 up 5 days, 17:29,  2 users,  load average: 3.09, 1.10, 0.43
 11:28:04 up 5 days, 17:29,  2 users,  load average: 3.45, 1.38, 0.54
 11:28:34 up 5 days, 17:30,  2 users,  load average: 3.67, 1.63, 0.66
 11:29:04 up 5 days, 17:30,  2 users,  load average: 3.80, 1.86, 0.76
 11:29:34 up 5 days, 17:31,  2 users,  load average: 3.88, 2.06, 0.87
 11:30:04 up 5 days, 17:31,  2 users,  load average: 3.93, 2.25, 0.97
 11:30:34 up 5 days, 17:32,  2 users,  load average: 3.64, 2.35, 1.04 <== 循环停止
 11:31:04 up 5 days, 17:32,  2 users,  load average: 2.20, 2.13, 1.01      11:31:34 up 5 days, 17:33,  2 users,  load average: 1.40, 1.94, 0.98

因为所显示的负载分别代表了 1、5 和 15 分钟的平均值,所以这些值需要一段时间才能恢复到系统接近正常的状态。

要停止循环,请发出像下面这样的 kill 命令 —— 假设作业号是 1-4,就像本篇文章前面显示的那样。如果你不确定,可以使用 jobs 命令来确认作业号。

$ kill %1 %2 %3 %4

增加压力的专用工具

另一种方法是使用专门为你制造系统压力的工具。其中一种叫做 stress(压力),可以以多种方式对系统进行压力测试。stress 工具是一个工作负载生成器,提供 CPU、内存和磁盘 I/O 压力测试。

在使用 --cpu 选项时,stress 命令使用平方根函数强制 CPU 努力工作。指定的 CPU 数量越多,负载上升的速度就越快。

下面第二个脚本(watch-it-2)可以用来衡量对系统内存使用的影响。请注意,它使用 free 命令来查看加压的效果。

$ cat watch-it-2
#!/bin/bash

while true
do
  free
  sleep 30
done

发起任务并观察压力:

$ stress --cpu 2

$ ./watch-it
 13:09:14 up 5 days, 19:10,  2 users,  load average: 0.00, 0.00, 0.00
 13:09:44 up 5 days, 19:11,  2 users,  load average: 0.68, 0.16, 0.05
 13:10:14 up 5 days, 19:11,  2 users,  load average: 1.20, 0.34, 0.12
 13:10:44 up 5 days, 19:12,  2 users,  load average: 1.52, 0.50, 0.18
 13:11:14 up 5 days, 19:12,  2 users,  load average: 1.71, 0.64, 0.24
 13:11:44 up 5 days, 19:13,  2 users,  load average: 1.83, 0.77, 0.30

在命令行中指定的 CPU 越多,负载就增加的越快。

$ stress --cpu 4
$ ./watch-it
 13:47:49 up 5 days, 19:49,  2 users,  load average: 0.00, 0.00, 0.00
 13:48:19 up 5 days, 19:49,  2 users,  load average: 1.58, 0.38, 0.13
 13:48:49 up 5 days, 19:50,  2 users,  load average: 2.61, 0.75, 0.26
 13:49:19 up 5 days, 19:50,  2 users,  load average: 3.16, 1.06, 0.38
 13:49:49 up 5 days, 19:51,  2 users,  load average: 3.49, 1.34, 0.50
 13:50:19 up 5 days, 19:51,  2 users,  load average: 3.69, 1.60, 0.61

stress 命令也可以通过 --io(输入/输出)和 --vm(内存)选项增加 I/O 和内存的负载来给系统施加压力。

在接下来的这个例子中,运行这个增加内存压力的命令,然后启动 watch-it-2 脚本。

$ stress --vm 2

$ watch-it-2
              total        used        free      shared  buff/cache   available
Mem:        6087064      662160     2519164        8868     2905740     5117548
Swap:       2097148           0     2097148
              total        used        free      shared  buff/cache   available
Mem:        6087064      803464     2377832        8864     2905768     4976248
Swap:       2097148           0     2097148
              total        used        free      shared  buff/cache   available
Mem:        6087064      968512     2212772        8864     2905780     4811200
Swap:       2097148           0     2097148

stress 的另一个选项是使用 --io 选项为系统添加输入/输出活动。在这种情况下,你可以使用这样的命令:

$ stress --io 4

然后你可以使用 iotop 观察受压的 I/O。注意,运行 iotop 需要 root 权限。

之前:

$ sudo iotop -o
Total DISK READ:         0.00 B/s | Total DISK WRITE:        19.36 K/s
Current DISK READ:       0.00 B/s | Current DISK WRITE:      27.10 K/s
    TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND
 269308 be/4 root        0.00 B/s    0.00 B/s  0.00 %  1.24 % [kworker~fficient]
    283 be/3 root        0.00 B/s   19.36 K/s  0.00 %  0.26 % [jbd2/sda1-8]

之后:

Total DISK READ:         0.00 B/s | Total DISK WRITE:         0.00 B/s
Current DISK READ:       0.00 B/s | Current DISK WRITE:       0.00 B/s
    TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND
 270983 be/4 shs         0.00 B/s    0.00 B/s  0.00 % 51.45 % stress --io 4
 270984 be/4 shs         0.00 B/s    0.00 B/s  0.00 % 51.36 % stress --io 4
 270985 be/4 shs         0.00 B/s    0.00 B/s  0.00 % 50.95 % stress --io 4
 270982 be/4 shs         0.00 B/s    0.00 B/s  0.00 % 50.80 % stress --io 4
 269308 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.09 % [kworker~fficient]

stress 只是给系统增加压力的若干工具之一。另一个较新的工具,stress-ng,将在以后的文章中介绍。

总结

用于系统压力测试的各种工具可以帮助你预测系统在真实世界的情况下如何响应,在这些情况下,它们受到增加的流量和计算需求。

虽然我们在文章中展示的是创建和测量各种类型的压力的方法,但最终的好处是压力如何帮助确定你的系统或应用程序对它的反应。


via: https://www.networkworld.com/article/3563334/how-to-stress-test-your-linux-system.html

作者:Sandra Henry-Stocker 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

在 Linux 中有很多永远循环(或直到你决定停止)的方法,你可以在命令行或脚本中执行此操作。

forwhile 命令使这件事非常容易。关于相应的语法和策略,只有几件事要牢记。

使用 while

最简单的永远循环之一是使用 while 命令,后面跟上条件 true。 你不必使用诸如 while [ 1 -eq 1 ] 之类的逻辑或类似的测试。 while true 测试表示循环将一直运行,直到你使用 CTRL-C 停止循环、关闭终端窗口或注销为止。这是一个例子:

$ while true
> do
>   echo Keep running
>   sleep 3
> done
Keep running
Keep running
Keep running
^C

你也可以使用 while : 做同样的事情。这里的关键是 : 总是返回成功,因此就像 while true 一样,此测试永远不会失败,并且循环会继续运行:

$ while :
> do
>   echo Keep running
>   sleep 3
> done
Keep running
Keep running
^C

如果你在脚本中插入了无限循环,并想提醒使用它的人如何退出脚本,那么可以使用 echo 命令添加提示:

while :
do
        echo Keep running
        echo "Press CTRL+C to exit"
        sleep 1
done

使用 for

for 命令还提供了一种永远循环的简便方法。虽然不如 while true 明显,但语法相当简单。你只需要在有界循环中替换参数即可,它通常类似于 “c 从等于 1 开始递增,直到 5”:

$ for (( c=1; c<=5; c++ ))

不指定任何参数的情况下:

$ for (( ; ; ))

没有起始值、增量或退出测试,此循环将永远运行或被强制停止:

$ for (( ; ; ))
> do
>    echo Keep running
>   echo “Press CTRL+C to exit”
>    sleep 2
> done
Keep your spirits up
Keep your spirits up
Keep your spirits up

为什么要永远循环?

在现实中,你不会想永远循环下去,但一直运行直到想要回家、工作完成或者遇到问题才退出并不罕见。任何构造为无限循环的循环都可以设置为根据各种情况退出。

该脚本将一直处理数据直到下午 5 点,或者说检查发现第一次超过 5 点的时间:

#!/bin/bash

while true
do
  if [ `date +%H` -ge 17 ]; then
    exit        # exit script
  fi
  echo keep running
  ~/bin/process_data     # do some work
done

如果要退出循环而不是退出脚本,请使用 break 命令而不是 exit

#!/bin/bash

while true
do
  if [ `date +%H` -ge 17 ]; then
    break       # exit loop
  fi
  echo keep running
  ~/bin/process_data
done
… run other commands here …

总结

永远循环很容易。指定要停止循环的条件却需要花费一些额外的精力。


via: https://www.networkworld.com/article/3562576/how-to-loop-forever-in-bash-on-linux.html

作者:Sandra Henry-Stocker 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

如何使用 cat、more、head 和 tail 命令查看 Linux 文件的内容,而不仅仅是文本文件。

Linux 提供了许多命令来查看文件的内容,包 括 catmoreheadtail,但这只是一个开始。

一方面,即使是最显而易见的命令也有很多许多用户不会去使用的选项。还有一些普普通通的命令提供了一些独特的功能。在本文中,我们将介绍查看文件内容的命令,以及如何定制这些视图以更好地满足你的需求的选项。

cat

cat 命令将文本文件的全部内容发送到终端窗口以供查看。实际上,如果你输入 cat,然后输入包含数千行内容的文件名,那么这些行将以极快的速度在你的窗口中滚动,你将无法看到除了最后一屏外的其他文本。对于 Linux 用户来说 cat 命令很熟悉,但即使是这个基本命令也提供了许多有用的选项,例如对输出中的行进行编号,这是我们许多人可能从未使用过的。更进一步,你不仅可以对行进行编号,还可以选择如何编号。

对每行进行编号就像这样:

$ cat -n msg
     1  Hello --
     2
     3  I hope you are having a wonderful day!
     4
     5
     6  That's it for ...       now
     7
     8  bye!
     9
    10  s.

你也可以只对有内容的行编号。请注意,对于此命令,仅包含空格的行不被视为“空”,而是会被编号。

$ cat -b msg
     1  Hello --

     2  I hope you are having a wonderful day!


     3  That's it for ...       now

     4  bye!

     5  s.

cat 命令允许你使用 -s 选项忽略重复的空白行,但是要完全忽略空白行你必须添加另一个命令。

$ cat -s msg
Hello --

I hope you are having a wonderful day!

That's it for ...       now

bye!

s.

要忽略所有空白行,只需如下将 cat 的输出通过管道传递给 grep 命令。 点(.)匹配包含任意字符的文本,因此它将显示任意非空的行,用于结束一行的回车换行做匹配(LCTT 译注:此处原文有误,径改)。

$ cat msg | grep .
Hello --
I hope you are having a wonderful day!
That's it for ...       now
bye!
s.

-E 选项通过在每行末尾加 $ 符提供视觉提示,来显示行尾是否还有多余的空格。

$ cat -E msg
Hello --$
$
I hope you are having a wonderful day!  $
$
$
That's it for ...       now$
$
bye!$
$
s.$

使用 -A 时,既可以在每行的末尾显示 $ 字符,并且制表符会显示为 ^I 而不是空白。

$ cat -A msg
Hello --$
$
I hope you are having a wonderful day!$
$
$
That’s it for ...^Inow$
$
bye!$
$
s.$

使用 head 和 tail 显示文件部分内容

headtail 显示文件的头部或尾部,默认为十行。 你可以使用 -3(显示 3 行)或 -11(显示 11 行)之类的字符串来指定要查看的其它行数。tail 命令与 head 的工作方式相同,但是显示文件的尾部而不是头部。

$ head -3 msg
Hello --
I hope you are having a wonderful day!
$ tail -3 msg
bye!

s.

你还可以结合使用 headtail 命令来查看文件中间的文本。你只需要选择起点和想要查看行数即可。在此例中,命令将在文件中显示第二个一百行,并在 cat 的帮助下为这些行编号。

$ cat -b mybigfile | head -200 | tail -100
   101  Invoice #2020-06-07a sent to vendor
   ...

使用 more 或者 less 浏览一屏文本

more 命令是一次浏览一屏内容的自然之选,而 less 通过使用上下键盘箭头增加了在文件中上下移动的能力,这样你就可以遍历内容,然后在文件中回退。

使用 od 查看文本的两种方法

od(八进制转储)命令能够以常规文本和一系列 ASCII 值(即该文本在文件中的实际编码方式)的形式查看文件。在下面的例子中可以看到,带编号的行显示了 ASCII 数字值,而其他行则显示了文本和不可打印的字符。

$ od -bc msg
0000000 110 145 154 154 157 040 055 055 012 012 111 040 150 157 160 145
          H   e   l   l   o       -   -  \n  \n   I       h   o   p   e
0000020 040 171 157 165 040 141 162 145 040 150 141 166 151 156 147 040
              y   o   u       a   r   e       h   a   v   i   n   g
0000040 141 040 167 157 156 144 145 162 146 165 154 040 144 141 171 041
          a       w   o   n   d   e   r   f   u   l       d   a   y   !
0000060 012 012 012 124 150 141 164 047 163 040 151 164 040 146 157 162
         \n  \n  \n   T   h   a   t   '   s       i   t       f   o   r
0000100 040 056 056 056 011 156 157 167 012 012 142 171 145 041 012 012
              .   .   .  \t   n   o   w  \n  \n   b   y   e   !  \n  \n
0000120 163 056 012
          s   .  \n

请注意,换行符显示为 \n(八进制 012),而制表符显示为 \t(八进制 011)。

od 命令特别有用的用途之一是查看非文本文件以获取可以标识文件类型的信息。在这里,我们看到 JFIF(JPEG 文件交换格式)标签,该标签让 file 之类报告文件类型的命令将它标示为 jpg 文件。这里还有很多其他有用的信息,特别是如果你对这些文件的格式感到好奇的话。

在接下来的命令中,我们查看 jpg 文件的开始部分。

$ od -bc arrow.jpg | head -12
0000000 377 330 377 340 000 020 112 106 111 106 000 001 001 000 000 001
        377 330 377 340  \0 020   J   F   I   F  \0 001 001  \0  \0 001
0000020 000 001 000 000 377 333 000 103 000 003 002 002 002 002 002 003
         \0 001  \0  \0 377 333  \0   C  \0 003 002 002 002 002 002 003
0000040 002 002 002 003 003 003 003 004 006 004 004 004 004 004 010 006
        002 002 002 003 003 003 003 004 006 004 004 004 004 004  \b 006
0000060 006 005 006 011 010 012 012 011 010 011 011 012 014 017 014 012
        006 005 006  \t  \b  \n  \n  \t  \b  \t  \t  \n  \f 017  \f  \n
0000100 013 016 013 011 011 015 021 015 016 017 020 020 021 020 012 014
         \v 016  \v  \t  \t  \r 021  \r 016 017 020 020 021 020  \n  \f
0000120 022 023 022 020 023 017 020 020 020 377 333 000 103 001 003 003
        022 023 022 020 023 017 020 020 020 377 333  \0   C 001 003 003

如果我们要 file 命令提供有关此图像的信息,我们可能会看到类似下面这样的信息。file 命令从文件开头的数据中提取了所有这些描述性信息:

$ file arrow.jpg
arrow.png: JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, baseline, precision 8, 500x375, components 3

使用 jp2a 将文件视为基于文本的图像

如果你只能在命令行工作,并且想了解特定图像包含的内容,那么可以使用 jp2a(jpeg to ascii)之类的工具提供字符渲染。图像在这种格式下的识别程度取决于文件。不要有太多期待,因为你将看到的图像版本是“低分辨率”下的测试!这是一只分辨率很低的帝王企鹅。(请离远点看)

$ jp2a Emperor_Penguin.jpg
MMMMMMMMWOdkNMMMMMMMMMMMMMMMMMMM
MMMXK0kc.... ,OKMMMMMMMMMMMMMMMM
MMNK0Ol...   :Xx'dNMMMMMMMMMMMMM
MMMMMMMd;lx00Oo. ..xMMMMMMMMMMMM
MMMMMMK.OXMMMMMN,...lMMMMMMMMMMM
MMMMMMx'KXNNMMMMK....0MMMMMMMMMM
MMMMMMx:kkKNWWMMMl.. 'NMMMMMMMMM
MMMMMMddx0NNNWMMMK'...;NMMMMMMMM
MMMMMMck0NNWWWWWMMd  ..lMMMMMMMM
MMMMMM.d0KXNWWWWMMo  ...WMMMMMMM
MMMMMM.xOXNNWNMMMW. ....KMMMMMMM
MMMMMM'kKNKWXWMMMK  ..'.0MMMMMMM
MMMMMMxckXNNNNMMMX  .:..XMMMMMMM
MMMMMMW;xKNWWWMMMM. .;. NMMMMMMM
MMMMMMMok0NNWNWMMMx .l..MMMMMMMM
MMMMMMMkxOKXWXNMMMMl.:'dMMMMMMMM
MMMMMMM0dKOdKXXNMMMMNx,WMMMMMMMM
MMMMMMMWoKxldXKNNMMMMM;MMMMMMMMM
MMMMMMMMxxxxdNWNXNMMMM;MMMMMMMMM
MMMMMMMMxOcoo0XOOOOWMW,kMMMMMMMM
MMMMMMM0xK;.cO0dNX:0XXd;NMMMMMMM
MMMNkdd:,'ldXXO0xl;x0kx:;lKMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM

总结

Linux 上有很多命令可以通过各种方式查看文件的内容。其中一些选项在你需要处理文件内容时可能会非常有用。其它的只是……有趣。


via: https://www.networkworld.com/article/3561490/5-ways-to-examine-the-content-of-files-on-linux.html

作者:Sandra Henry-Stocker 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

符号链接是指向另一个文件的 Linux 文件。如果删除了被引用的文件,符号链接会保留,但不会显示有问题,除非你尝试使用它。以下是查找和删除指向文件已被删除的符号链接的简单方法。

符号链接 symbolic link 在 Linux 系统上扮演了非常有用的角色。它们可以帮助你记住重要文件在系统上的位置,使你更容易访问这些文件,并让你不必为了更方便访问大文件而复制它们,从而节省了大量的空间。

什么是符号链接?

通常称它们为“符号链接”或“软链接”,符号链接是非常小的文件。实际上,符号链接真正包含的是它指向的文件的名称,通常包含路径(相对于当前位置或绝对路径)。如果有个名为 ref1 的文件指向名为 /apps/refs/ref-2020 的文件,那么 ref1 的长度将为 19 个字符,即使 ref-202 文件有 2TB。如果指向 ./ref-2020,那么长度仅为 10 个字符。如果指向 ref-2020,那么只有 8 个字节。

如果你执行 vi ref1 之类的命令(其中 ref1 是符号链接的名称),你将编辑 ref1 指向的文件,而不是符号链接本身的内容。Linux 系统知道如何使用符号链接,并且可以做正确的事。同样,如果你使用诸如 catmoreheadtail 之类的命令,那么将查看引用文件的内容。

另一方面,如果删除符号链接,你将删除该链接,而不是引用的文件。再说一次,Linux 知道怎么做。符号链接使得使用和共享文件更加容易,仅此而已。

符号链接损坏时

当一个符号链接所指向的文件从系统中删除或重新命名时,符号链接将不再起作用。符号链接只不过是存储在某个特定目录中的引用而已,它不会随着指向它的文件发生变化而更新或删除。它一直指向被引用的文件,即使这个文件早已消失。

如果你尝试使用指向一个不存在的文件的符号链接,那么将出现如下错误:

$ tail whassup
tail: cannot open 'whassup' for reading: No such file or directory

如果你尝试访问指向自身的符号链接(是的,奇怪的事情发生了),你将看到类似以下的内容:

$ cat loopy
cat: loopy: Too many levels of symbolic links
$ ls -l loopy
lrwxrwxrwx 1 shs shs 5 May 28 18:07 loopy -> loopy

而且,如果(上面的)长列表的第一个字母没有引起你的注意,这表示该文件是符号链接。rwxrwxrwx 权限是标准权限,并不反映符号链接指向的文件的权限。

查找损坏的符号链接

find 命令有一个选项,能让你找到指向不再存在的文件的符号链接。此命令列出当前目录中的符号链接:

$ find . -type l

l (小写字母 L)告诉 find 命令查找符号链接。

另一方面,下面的命令在当前目录中查找指向不存在的文件的符号链接:

$ find . -xtype l

为了避免在该命令尝试查找你无权检查的文件或目录时发生错误,你可以将所有错误输出到 /dev/null,如下所示:

$ find . -xtype l 2>/dev/null

你也可以使用此命令找到损坏的符号链接。它比前面的更长,但做的是同样的事情:

$ find . -type l ! -exec test -e {} \; -print 2>/dev/null

如何处理损坏的符号链接

除非你知道符号链接引用的文件会被替换,否则最好的方法是直接删除损坏的链接。实际上,如果需要,你可以使用一条命令查找并删除损坏的符号链接,如:

$ find . -xtype l 2>/dev/null -exec rm {} \;

该命令的 rm {} 部分会变成“删除文件”的命令

如果你想将符号链接与不同的文件相关联,你必须先删除该符号链接,然后重新创建它,使其指向新文件。这是一个例子:

$ rm ref1
$ ln -s /apps/data/newfile ref1

总结

符号链接使引用的文件更易于查找和使用,但有时它会比那些宣传去年已经关闭的餐馆的路标还过分。find 命令可以帮助你摆脱损坏的符号链接,或者提醒你没有你可能仍然需要的文件。


via: https://www.networkworld.com/article/3546252/how-to-find-and-remove-broken-symlinks-on-linux.html

作者:Sandra Henry-Stocker 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

cd 命令可能是任何 Linux 用户学习的前 10 个命令之一,但这并不是在 Linux 文件系统中导航的唯一方法,这里还有其他一些方法。

无论你是在文件系统中四处查看、寻找文件还是尝试进入重要目录,Linux 都可以提供很多帮助。在本文中,我们将介绍一些技巧,使你可以在文件系统中移动,查找和使用所需的命令也更加轻松。

添加到 $PATH

确保你不必花费大量时间在 Linux 系统上查找命令的最简单、最有用的方法之一就是在 $PATH 变量中添加适当的目录。但是,添加到 $PATH 变量中的目录顺序非常重要。它们确定系统在目录中查找要运行命令的目录顺序–在找到第一个匹配项时停止。

例如,你可能希望将家目录放在第一个,这样,如果你创建的脚本与其他可执行文件有相同的名称,那么只要输入该脚本的名称,它便会运行。

要将家目录添加到 $PATH 变量中,可以执行以下操作:

$ export PATH=~:$PATH

~ 字符代表家目录。

如果将脚本保存在 bin 目录中,下面的会有效:

$ export PATH=~/bin:$PATH

然后,你可以运行位于家目录中的脚本,如下所示:

$ myscript
Good morning, you just ran /home/myacct/bin/myscript

重要提示:上面显示的命令会添加到你的搜索路径中,因为 $PATH(当前路径)被包含在内。它们不会覆盖它。你的搜索路径应该在你的 .bashrc 文件中配置,任何你打算永久化的更改也应该添加到那里。

使用符号链接

符号链接提供了一种简单而明显的方式来记录可能经常需要使用的目录的位置。例如,如果你管理网站的内容,那么可能需要通过创建如下链接来使你的帐户“记住”网页文件的位置:

ln -s /var/www/html www

参数的顺序很重要。第一个(/var/www/html)是目标,第二个是你创建的链接的名称。如果你当前不在家目录中,那么以下命令将执行相同的操作:

ln -s /var/www/html ~/www

设置好之后,你可以使用 cd www 进入 /var/www/html

使用 shopt

shopt 命令还提供了一种让移动到其他目录更加容易的方法。当你使用 shoptautocd 选项时,只需输入名称即可转到目录。例如:

$ shopt -s autocd
$ www
cd -- www
/home/myacct/www
$ pwd -P
/var/www/html

$ ~/bin
cd -- /home/myacct/bin
$ pwd
/home/myacct/bin

在上面的第一组命令中,启用了 shopt 命令的 autocd 选项。输入 www,就会调用 cd www 命令。由于此符号链接是在上面的 ln 命令示例之一中创建的,因此将我们移至 /var/www/htmlpwd -P 命令显示实际位置。

在第二组中,键入 ~/bin 会调用 cd 进入在用户家目录的 bin 目录。

请注意,当你输入的是命令时,autocd 行为将不会生效,即使它也是目录的名称。

shopt 是 bash 内置命令,它有很多选项。这只是意味着你不必在要进入每个目录的名称之前输入 cd

要查看 shopt 的其他选项,只需输入 shopt

使用 $CDPATH

可能进入特定目录的最有用技巧之一,就是将你希望能够轻松进入的路径添加到 $CDPATH 中。这将创建一个目录列表,只需输入完整路径名的一部分即可进入。

一方面,这可能有点棘手。你的 $CDPATH 需要包含要移动到的目录的父目录,而不是目录本身。

例如,假设你希望仅通过输入 cd html 就可以移至 /var/www/html 目录,并仅使用 cd 和简单目录名即可移至 /var/log 中的子目录。在这种情况下,此 $CDPATH 就可以起作用:

$ CDPATH=.:/var/log:/var/www

你将看到:

$ cd journal
/var/log/journal
$ cd html
/var/www/html

当你输入的不是完整路径时,$CDPATH 就会生效。它向下查看其目录列表,以查看指定的目录是否存在于其中一个目录中。找到匹配项后,它将带你到那里。

$CDPATH 开头保持 . 意味着你可以进入本地目录,而不必在 $CDPATH 中定义它们。

$ export CDPATH=".:$CDPATH"
$ Videos
cd -- Videos
/home/myacct/Videos

在 Linux 文件系统键切换并不难,但是如果你使用一些方便的技巧轻松地到达各个位置,那你可以节省一些大脑细胞。


via: https://www.networkworld.com/article/3533421/tricks-for-getting-around-your-linux-file-system.html

作者:Sandra Henry-Stocker 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出