Linux中批量命名文件名的6种方法

方法 1 – 使用 mmv

mmv 实用程序用于在类 Unix 操作系统中使用标准通配符批量移动、复制、追加和重命名文件。它在基于 Debian 的系统的默认存储库中可用。要将其安装在 Debian、Ubuntu、Linux Mint 上,请运行以下命令:

$ sudo apt-get install mmv

假设您当前目录中有以下文件。

$ ls
a1.txt a2.txt a3.txt

现在,您要将字母“a”开头的所有文件重命名为“b”。当然,您可以在几秒钟内手动执行此操作。但试想一下,如果您有数百个文件并想要重命名它们?这是一个非常耗时的过程。这是mmv命令提供帮助的地方。

要将所有以字母“a”开头的文件重命名为“b”,只需运行:

$ mmv a\* b\#1

让我们检查文件是否已重命名。

$ ls
b1.txt b2.txt b3.txt

如您所见,所有以字母“a”开头的文件(即a1.txt,a2.txt,a3.txt)都重命名为b1.txt,b2.txt,b3.txt。

解释

在上面的示例中,第一个参数 (a\*) 是 “from” 模式,第二个参数是 “to” 模式 ( b\#1 )。根据上面的示例,mmv将查找任何以字母“a”为首的文件名,并根据第二个参数(即“to”模式)重命名匹配的文件。我们使用通配符(如“*”、“?”和“[]”)来匹配一个或多个任意字符。请注意,您必须转义通配符,否则它们将被shell扩展并且mmv将无法理解它们。

“to”模式中的“#1”是通配符索引。它与在“from”模式中找到的第一个通配符匹配。“to”模式中的“#2”将与第二个通配符匹配,依此类推。在我们的示例中,我们只有一个通配符(星号),所以我们写一个 #1。而且,哈希符号也应该转义。此外,您也可以用引号将模式括起来。

您甚至可以将具有特定扩展名的所有文件重命名为其他扩展名。例如,要将所有.txt文件重命名为当前目录中.doc文件格式,只需运行:

$ mmv \*.txt \#1.doc

下面是另一个示例。假设您有以下文件。

$ ls
abcd1.txt abcd2.txt abcd3.txt

您希望在当前目录的所有文件中将第一次出现的 abc 替换为 xyz。你会怎么做?

简单。

$ mmv '*abc*' '#1xyz#2'

请注意,在上面的例子中,我用单引号括起了模式。

让我们检查一下“abc”是否真的被替换为“xyz”。

$ ls
xyzd1.txt xyzd2.txt xyzd3.txt

看?文件 abcd1.txtabcd2.txt 和 abcd3.txt已重命名为 xyzd1.txtxyzd2.txt 和 xyzd3.txt

mmv命令的另一个显着功能是您可以只打印输出,而不是使用-n选项重命名文件,如下所示。

$ mmv -n a\* b\#1 
a1.txt -> b1.txt
a2.txt -> b2.txt
a3.txt -> b3.txt

这样,您就可以在重命名文件之前简单地验证mmv命令实际执行的操作。

有关更多详细信息,请参阅手册页。

$ man mmv

方法 2 – 使用重命名实用程序

重命名实用程序将通过替换名称中第一次出现的表达式来重命名给定文件。

rename 命令预装在大多数类 Unix 操作系统中。如果它在默认情况下不可用,请运行以下命令将其安装在基于 Debian 的系统上:

$ sudo apt install rename

例如,我在当前目录中有以下文件。

$ ls
abcd1.txt abcd2.txt abcd3.txt

让我们将 abc 的第一次出现替换为 xyz,只要找到。为此,请运行:

$ rename 's/abc/xyz/' *

现在,验证是否已使用ls命令进行了更改。

$ ls
xyzd1.txt xyzd2.txt xyzd3.txt

有时,您可能只打印输出,而不是重命名文件。如果是这样,请使用 -n 标志显示将发生哪些重命名而不执行它们:

$ rename -n 's/abc/xyz/' *
rename(abcd1.txt, xyzd1.txt)
rename(abcd2.txt, xyzd2.txt)
rename(abcd3.txt, xyzd3.txt)

如您所见,上述命令没有进行任何更改,而只是显示将发生的重命名。

即使该操作会使用 -f 标志覆盖现有文件,也可以强制执行重命名任务,如下所示。

$ rename -f 's/abc/xyz/' *

如果您不想覆盖文件,只需将它们转换为大写或小写字母(反之亦然)即可防止“已经存在”错误。要将所有文件名转换为小写,请执行以下操作:

$ rename 'y/a-z/A-Z/' *

让我们检查是否已进行更改。

$ ls
ABCD1.TXT ABCD2.TXT ABCD3.TXT

是的,文件名中的字母已从小写更改为大写。

同样,要将文件名转换为小写,请运行:

$ rename 'y/A-Z/a-z/' *

我们也可以删除文件名中的所有空行。例如,我有以下文件。

$ ls
Clouds of Sunset.mp3

要删除上述文件名中的所有空格,请运行:

$ rename "s/ *//g" *

现在,文件名没有任何空格。

$ ls
CloudsofSunset.mp3

将空格替换为下划线:

$ rename 's/\s+/_/g' *

您可能希望更改文件扩展名,但不重命名文件名。这也是可能的。以下命令会将所有 *.txt 文件重命名为 *.doc。

$ rename 's/\.txt$/.doc/' *.txt

使用 ls 命令验证更改:

$ ls
abcd1.doc abcd2.doc abcd3.doc

若要删除.txt匹配的所有文件中的扩展名,请运行:

$ rename 's/\.txt$//' *.txt

有关更多详细信息,请参阅手册页。

$ man rename

方法 3 – 使用重命名实用程序

renameutils是一组程序,旨在更快,更轻松地批量重命名文件和目录。Renameutils由以下五个程序组成:

  1. qmv (快速移动),
  2. qcp (快速复制),
  3. imv (交互式移动),
  4. icp(交互式副本),
  5. deurlname (delete URL).

安装重命名实用程序

Renameutils在大多数Linux发行版的默认存储库中可用。要将其安装在基于 Arch 的系统上,请启用社区存储库并运行:

$ sudo pacman -Syu renameutils

在基于 Debian 的系统上:

$ sudo apt install renameutils

现在,让我们看一些例子。

1. 全要素

qmv程序将在默认文本编辑器中打开目录中的文件名,并允许您编辑它们。

我在一个名为“ostechnix”的目录中有以下三个文件。

$ ls ostechnix/
abcd1.txt abcd2.txt abcd3.txt

要重命名“ostechnix”目录中的文件名,只需执行以下操作:

$ qmv ostechnix/

现在,根据需要更改文件名。您将在编辑文件名时看到实时预览。

或者,您可以cd进入目录,然后简单地运行“qmv”。

打开文件后,您将看到两列,如以下屏幕截图所示。

Linux中批量命名文件名的6种方法

使用 qmv 批量重命名文件

左列显示源文件名,右列显示目标名称(编辑后将获得的输出文件名)。

现在,根据需要重命名右侧的所有输出名称。

Linux中批量命名文件名的6种方法

使用 qmv 批量重命名文件

重命名文件名后,保存并退出文件。

最后,您将看到以下输出:

Plan is valid.

abcd1.txt -> xyzd1.txt
abcd2.txt -> xyzd2.txt
abcd3.txt -> xyzd3.txt
   Regular rename

abcd1.txt -> xyzd1.txt
abcd2.txt -> xyzd2.txt
abcd3.txt -> xyzd3.txt

现在,检查是否确实使用“ls”命令进行了更改:

$ ls ostechnix/
xyzd1.txt xyzd2.txt xyzd3.txt

看?所有文件都将被重命名。不仅仅是文件,重命名实用程序还将重命名目录名称。

以下是qmv程序的快速视频演示:

Linux中批量命名文件名的6种方法

使用 qmv 批量重命名文件

如果不想编辑双列格式的文件名,请使用以下命令仅显示目标文件列。

$ qmv -f do ostechnix/

其中,“-f”表示格式“do”表示仅目标格式。

现在,您将只看到目标列。这是我们进行更改的列。

Linux中批量命名文件名的6种方法

完成后,保存并关闭文件。

有关更多详细信息,请参阅手册页。

$ man qmv

2. 断续器

qcp 程序的工作方式与 qmv 类似,但会复制文件而不是重命名它们。在这种情况下,您将获得同一文件的两个实例。这意味着它将保留原始文件和重复文件。

$ qcp ostechnix/

重命名右侧列出的文件名。保存并退出文件。最后,验证使用 ls 命令所做的更改:

$ ls ostechnix/
abcd1.txt abcd2.txt abcd3.txt xyzd1.txt xyzd2.txt xyzd3.txt

有关更多详细信息,请参阅手册页。

$ man qcp

3. imv

imv程序允许我们以交互方式重命名文件名。显然,它不适用于批量重命名。您只能逐个重命名文件。

$ imv ostechnix/abcd1.txt

根据需要编辑文件名,然后单击 Enter 将其重命名。

有关更多详细信息,请参阅手册页。

$ man imv

4. icp

icp 程序与 imv 相同,但它会复制文件而不是移动它们。

例:

$ icp ostechnix/abcd1.txt

有关更多用例和命令,请参阅手册页。

$ man icp

我不知道为什么开发人员添加了这两个实用程序,而我们可以使用mvcp命令做同样的事情。

5. deurlname

deurlname 程序从文件名中删除 URL 编码的字符(如表示空格的 %20)。某些程序(例如 w3m)倾向于将这些字符编码在保存的文件中。您可以使用此工具来清理从互联网上下载的文件名。

请看下面的文件。

$ ls
omg%20ponnu%20ily%20kannu.mp3

文件名中有一些特殊的字符和数字。如果清理它,只需运行:

$ deurlname omg%20ponnu%20ily%20kannu.mp3

现在,看看文件名是如何更改的。

$ ls
omg ponnu ily kannu.mp3

文件名干净且可读。

有关更多详细信息,请参阅手册页。

$ man deurlname

有关更多详细信息,请参阅本指南末尾提供的项目网站。

方法4 – 使用vimv

顾名思义,Vimv是一个命令行实用程序,可以使用Vim编辑器批量重命名文件。当然,您可以通过更改环境变量的值来更改$EDITOR编辑器。

要安装 Vimv,git 克隆存储库:

$ git clone https://github.com/thameera/vimv.git

将 vimv 二进制文件复制到$PATH,例如 /usr/local/bin/。

$ sudo cp vimv/vimv /usr/local/bin/

最后,使其可执行:

$ sudo chmod +x /usr/local/bin/vimv

现在转到目录并运行以下命令来编辑文件名。您将在Vi编辑器中看到文件名。按 i 切换到交互模式,并按照在 Vi 编辑器中编辑文本的方式编辑文件名。完成后,按ESC键并键入:wq保存并退出。

目录中的文件现在应该重命名。这是一个简短的视频演示。

Linux中批量命名文件名的6种方法

使用 Vimv 批量重命名文件

有关更多详细信息,请参阅本指南末尾给出的项目 GitHub 存储库。

方法5 – 使用Emacs

如果您安装了Emacs编辑器的系统,则可以按照以下步骤轻松进行批量重命名。

1. 打开您的 Emacs 编辑器。

2. 按 Alt+x 并键入以下内容,然后按 Enter 键切换到 wdired 模式(“可写目录编辑器模式”的缩写)。

dired

3. 输入目录的路径(例如 /home/sk/ostechnix),其中包含要重命名的文件并按 Enter 键。

然后,按 Ctrl+x 和 Ctrl+q 切换到读写模式。

 

5.现在,重命名文件。完成后,按 Ctrl+c 和 Ctrl+c(两次)以保存更改。若要中止更改,请按 Ctrl+c 和 Ctrl+k

观看演示视频:

Linux中批量命名文件名的6种方法

使用 Emacs 批量重命名文件

看?一次重命名多个文件非常简单。

方法6 – 使用图纳尔文件管理器

默认情况下,Thunar文件管理器具有内置的批量重命名选项。

Thunar 在大多数 Linux 发行版的默认存储库中可用。

要将其安装在基于 Arch 的系统上,请运行:

$ sudo pacman -S thunar

在 RHEL 上,CentOS:

$ sudo yum install thunar

在 Fedora 上:

$ sudo dnf install thunar

在 openSUSE 上:

$ sudo zypper install thunar

On Debian, Ubuntu, Linux Mint:

$ sudo apt-get install thunar

安装后,您可以从菜单或应用程序启动器中启动批量重命名实用程序。要从终端启动它,请使用以下命令:

$ thunar -B

这就是批量重命名的外观。

Linux中批量命名文件名的6种方法

单击加号,然后选择要重命名的文件列表。批量重命名可以重命名文件的名称、文件的后缀或文件的名称和后缀。Thunar 目前支持以下批量重命名器:

  • 插入日期或时间
  • 插入或覆盖
  • 编号
  • 删除字符
  • 搜索和替换
  • 大写/小写

Linux 中改变主机名的 4 种方法

使用 systemd 的系统自带一个名为 hostnamectl 的好用工具,它可以使我们能够轻易地管理系统的主机名。

当你使用这个原生命令时,它可以立刻改变主机名而无需重启来生效。

但假如你通过手动修改某个配置文件来更改主机名,那么就可能需要经过重启来生效。

在这篇文章中,我们将展示在使用 systemd 的系统中改变主机名的 4 种方法。

hostnamectl 命令允许在 Linux 中设置三类主机名,它们的细节如下:

  • 静态: 这是静态主机名,由系统管理员添加。
  • 瞬时/动态: 这个由 DHCP 或者 DNS 服务器在运行时赋予。
  • 易读形式: 它可以由系统管理员赋予。这个是自由形式的主机名,以一种易读形式来表示服务器,例如 “JBOSS UAT Server” 这样的名字。

这些都可以使用下面 4 种方法来设置。

  • hostnamectl 命令:控制系统主机名。
  • nmcli 命令:是一个控制 NetworkManager 的命令行工具。
  • nmtui 命令:是一个控制 NetworkManager 的文本用户界面。
  • /etc/hostname 文件:这个文件中包含系统的静态主机名。

方法 1:在 Linux 中使用 hostnamectl 来改变主机名

hostnamectl 可被用来查询和改变系统的主机名,以及相关设定。只需运行 hostnamectl 便可以查看系统的主机名了。

  1. $ hostnamectl

或者使用下面的命令:

  1. $ hostnamectl status
  2. Static hostname: daygeek-Y700
  3. Icon name: computer-laptop
  4. Chassis: laptop
  5. Machine ID: 31bdeb7b83230a2025d43547368d75bc
  6. Boot ID: 267f264c448f000ea5aed47263c6de7f
  7. Operating System: Manjaro Linux
  8. Kernel: Linux 4.19.20-1-MANJARO
  9. Architecture: x86-64

假如你想改变主机名,可以使用下面的命令格式:

语法格式:

$ hostnamectl set-hostname [YOUR NEW HOSTNAME]

 

使用下面的命令来使用 hostnamectl 更改主机名。在这个例子中,我将把主机名从 daygeek-Y700 改为 magi-laptop

$ hostnamectl set-hostname magi-laptop

你可以使用下面的命令来查看更新后的主机名。

 

$ hostnamectl
Static hostname: magi-laptop
Icon name: computer-laptop
Chassis: laptop
Machine ID: 31bdeb7b83230a2025d43547368d75bc
Boot ID: 267f264c448f000ea5aed47263c6de7f
Operating System: Manjaro Linux
Kernel: Linux 4.19.20-1-MANJARO
Architecture: x86-64

 

方法 2:在 Linux 中使用 nmcli 命令来更改主机名

nmcli 是一个命令行工具,旨在控制 NetworkManager 并报告网络状态。

nmcli 被用来创建、展示、编辑、删除、激活和注销网络连接,同时还可以用来控制和展示网络设备的状态。另外,它也允许我们更改主机名。

使用下面的命令来利用 nmcli 查看当前的主机名。

$ nmcli general hostname
daygeek-Y700

 

语法格式:

$ nmcli general hostname [YOUR NEW HOSTNAME]

 

使用下面的命令来借助 nmcli 命令可以更改主机名。在这个例子中,我将把主机名从 daygeek-Y700 变成 magi-laptop

$ nmcli general hostname magi-laptop

 

它可以在不重启下设备的情况下生效,但为了安全目的,只需要重启 systemd-hostnamed 服务来使得更改生效。

$ sudo systemctl restart systemd-hostnamed

再次运行相同的 nmcli 命令来检查更改后的主机名。

$ nmcli general hostname
magi-laptop

 

方法 3:在 Linux 中使用 nmtui 来更改主机名

nmtui 是一个基于 curses 库的 TUI 应用,被用来和 NetworkManager 交互。当启动 nmtui 后,如果没有指定 nmtui 的第一个命令行参数,它将提醒用户选择执行某项活动。

在终端中运行下面的命令来开启文本用户界面。

$ nmtui

 

使用向下箭头按键来选择 “Set system hostname” 这个选项,然后敲击回车键。

下面的截图展示的是原来的主机名。

我们需要做的就是删除原来的主机名,再输入新的主机名,然后选中 “OK” 敲击回车确认就可以了。

然后它将在屏幕中向你展示更新后的主机名,再次选中 “OK” 敲击回车确认就完成更改了。

最后,选中 “Quit” 按钮来从 nmtui 终端界面离开。

它可以在不重启设备的情况下生效,但为了安全目的,需要重启 systemd-hostnamed 服务来使得更改生效。

$ sudo systemctl restart systemd-hostnamed

 

你可以运行下面的命令来查看更新后的主机名。

$ hostnamectl
Static hostname: daygeek-Y700
Icon name: computer-laptop
Chassis: laptop
Machine ID: 31bdeb7b83230a2025d43547368d75bc
Boot ID: 267f264c448f000ea5aed47263c6de7f
Operating System: Manjaro Linux
Kernel: Linux 4.19.20-1-MANJARO
Architecture: x86-64

 

方法 4:在 Linux 中使用 /etc/hostname 来更改主机名

除了上面的方法外,我们还可以通过修改 /etc/hostname 文件来达到修改主机名的目的。但这个方法需要服务器重启才能生效。

使用下面的命令来检查 /etc/hostname 文件以查看当前的主机名:

 

$ cat /etc/hostname
daygeek-Y700

 

要改变主机名,只需覆写这个文件就行了,因为这个文件只包含主机名这一项内容。

$ sudo echo "magi-daygeek" > /etc/hostname
$ cat /etc/hostname
magi-daygeek

 

然后使用下面的命令重启系统:

$ sudo init 6

 

最后查看 /etc/hostname 文件的内容来验证主机名是否被更改了。

 

$ cat /etc/hostname
magi-daygeek

VMware中Manjaro安装VMwaretools的正确姿势

技术标签: manjaro  虚拟机  vmware tools  安装教程  linux

VMware中Manjaro安装VMwaretools的正确姿势

 

前言

我最近发现的Manjaro,瞬间被他的画风吸引,然后欢天喜地地去官网下载manjaro的kde镜像,然后在虚拟机中安装,然后安装VMware-tools卡在rc0.d/rc6.d。我的环境是VMware15+manjaro18.0.4

方法一

运行脚本

wget http://www.as2.com/linux/tools/vmtools-4-arch-and-co.tar.bz2
  • 1
tar -xjf vmtools-4-arch-and-co.tar.bz2
  • 1
sudo bash ./vmtools-4-arch-and-co.sh
  • 1

方法二

卸载open-vm-tools

sudo pacman -R open-vm-tools
  • 1

下载vmwaretools补丁

git clone https://github.com/rasa/vmware-tools-patches.git
  • 1

进入vmware-tools-patches目录

cd vmware-tools-patches
  • 1

运行补丁

中间一路回车

sudo ./patched-open-vm-tools.sh
  • 1

经过漫长的等待不负众望迎来了第一个错误提示:
找不到/lib/modules/4.19.28-1-MANJARO
这里不慌,反手进入这个目录发现有三个文件:3.16.65-1-MANJARO、4.19.36-1-MANJARO、extramodules-4.19-MANJARO
然后我把4.19.36-1-MANJARO重命名为他需要的4.19.28-1-MANJARO文件名,这样他脚本加载到运行4.19.28-1-MANJARO时可以正确找到该文件,就算这个文件原名不是这个,相当于是假装降级操作

sudo mv 4.19.36-1-MANJARO 4.19.28-1-MANJARO
  • 1

删除刚刚安装到一半就报错的安装目录

sudo rm -rf vmware-tools-patches
  • 1

重新安装补丁

sudo ./patched-open-vm-tools.sh
  • 1

完成

Enjoy

一键PXE+Kickstart自动化部署脚本

一键PXE+Kickstart自动化部署脚本(CentOS)

八宝茶&黑兰州

于 2021-03-10 18:53:31 发布

71
收藏
分类专栏: 运维脚本 文章标签: linux centos
版权

运维脚本
专栏收录该内容
4 篇文章0 订阅
订阅专栏
基于shell的自动化部署脚本
淦!由于本人太菜的原因,一度导致就这么个破脚本浪费了四天时间!大量时间都在调错上,累到虚脱!
autoIS.sh

#############by西北苦命漢###################
#!/bin/bash
#LANG=”zh_CN.GB18030
############pxe+kickstart無人值守安裝腳本################
function Divider(){
echo “################################################################”
}
if [ $# -eq 0 ]
then
echo -e “\033[31m 缺少参数!\n使用方法:sh autoIS.sh [服务端IP地址]”
exit
fi
function show(){
echo -e “\033[31m 網絡環境異常,請檢查! \033[0m”
exit
}
function status(){
if [ $1 -eq 0 ]
then
echo -e “\033[32m $2成功! \033[0m”
else
echo -e “\033[31m $2失败! \033[0m”
fi

}
if [ `id -u` -ne 0 ]
then
echo -e “\033[31m 此腳本需管理員執行,當前用戶非管理員! \033[0m”
exit
fi
find /dev/sr0
if [[ $? != 0 ]]
then
echo -e “\033[31m error:sr0! \033[0m”
echo -e “\033[31m 请确认您的光驱内有光盘?(Y/N): \033[0m \c”
read que
if [[ $que == “n” ]] || [[ $que == “N” ]]
then
exit
fi
fi
echo -e “\033[34m 正在檢查網絡狀態,請等待! \033[0m”
ping -c 3 www.baidu.com > /dev/null && echo -e “\033[34m 開始部署環境 \033[0m” || show
####環境部署模塊####
Divider
yum install -y dhcp && echo -e “\033[32m 1.DHCP服務安裝成功! \033[0m” || echo -e “\033[31m 1.DHCP服務安裝失敗! \033[0m”
yum install -y tftp-server && echo -e “\033[32m 2.TFTP服務安裝成功! \033[0m” || echo -e “\033[31m 2.TFTP服務安裝失敗! \033[0m”
yum install -y xinetd && echo -e “\033[32m 3.Xinetd服務安裝成功! \033[0m” || echo -e “\033[31m 3.Xinetd服務安裝失敗! \033[0m”
yum install -y syslinux && echo -e “\033[32m 4.SYSlinux服務安裝成功! \033[0m” || echo -e “\033[31m 4.SYSlinux服務安裝失敗! \033[0m”
yum install -y httpd && echo -e “\033[32m 5.HTTP服務安裝成功! \033[0m” || echo -e “\033[31m 5.HTTP服務安裝失敗! \033[0m”
echo -e “\033[34m 環境部署動作結束!!! \033[0m”
mkdir /media/cdrom
mount /dev/sr0 /media/cdrom/ && echo -e “\033[32m 6.光盘挂载成功! \033[0m” || echo -e “\033[31m 6.光盘挂载失敗! \033[0m”
echo -e “[centos]\nname=centos\nbaseurl=file:///media/cdrom\ngpgcheck=0\nenabled=1” > /etc/yum.repos.d/local.repo && echo -e “\033[32m 7.仓库部署成功! \033[0m” || echo -e “\033[31m 7.仓库部署失敗! \033[0m”
systemctl enable httpd
str=`ifconfig | sed -n ‘1p’`
str1=`echo ${str%%:*}`
nmcli connection modify $str1 ipv4.method manual ipv4.addresses $1/24 ipv4.gateway “” ipv4.dns “” connection.autoconnect yes && echo -e “\033[32m 8.网卡已重新配置! \033[0m” || echo -e “\033[31m 8.网卡配置失败,请自行修改ip地址为$1 \033[0m”
nmcli connection up $str1
IP3=$1
flag=0
IP3=${IP3%.*}
sed -ri “s/([0-9]{1,3}\.){2}[0-9]{1,3}/$IP3/g” dhcpd1.txt || flag=1
sed -ri “s/([0-9]{1,3}\.){2}[0-9]{1,3}/$IP3/g” dhcpd2.txt || flag=1
status $flag “IP地址写入DHCP配置文件”
Divider
####DHCP防报错模块####
flag=0
cat ./dhcpd1.txt > /etc/dhcp/dhcpd.conf || flag=1
sed -i “2asubnet $IP3\.0 netmask 255.255.255.0 {” /etc/dhcp/dhcpd.conf || flag=1
sed -i “4aoption subnet-mask 255.255.255.0;” /etc/dhcp/dhcpd.conf || flag=1

systemctl restart dhcpd || flag=1
status $flag “DHCP服务防报错配置”
####服務配置模塊####
Divider
cat ./dhcpd2.txt > /etc/dhcp/dhcpd.conf && echo -e “\033[32m 1.DHCP配置文件寫入成功! \033[0m” || echo -e “\033[31m 1.DHCP配置文件寫入失敗! \033[0m”
sed -i “4asubnet $IP3\.0 netmask 255.255.255.0 {” /etc/dhcp/dhcpd.conf || flag=1
sed -i “5aoption subnet-mask 255.255.255.0;” /etc/dhcp/dhcpd.conf || flag=1
sed -i “6aoption domain-name-servers $1;” /etc/dhcp/dhcpd.conf || flag=1
sed -i “10anext-server $1;” /etc/dhcp/dhcpd.conf || flag=1
line=`sed -n ‘/disable/=’ /etc/xinetd.d/tftp`
sed -i “$line{s/yes/no/g}” /etc/xinetd.d/tftp && echo -e “\033[32m 2.TFTP配置文件寫入成功! \033[0m” || echo -e “\033[31m 2.TFTP配置文件寫入失敗! \033[0m”
flag=0
cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/ || flag=1
cp /media/cdrom/images/pxeboot/{vmlinuz,initrd.img} /var/lib/tftpboot/ || flag=1
cp /media/cdrom/isolinux/{vesamenu.c32,*.msg} /var/lib/tftpboot/ || flag=1
status $flag “3.SYSlinux引导文件拷贝至TFTP目录下”
mkdir /var/lib/tftpboot/pxelinux.cfg
cp /media/cdrom/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default && echo -e “\033[32m 3.开机配置文件拷贝成功! \033[0m” || echo -e “\033[31m 3.开机配置文件拷贝失敗! \033[0m”
flag=0
str1=”hd:LABEL=CentOS\x207\x20x86_64″
sed -i ‘1c default linux’ /var/lib/tftpboot/pxelinux.cfg/default || flag=1
sed -i ’64d’ /var/lib/tftpboot/pxelinux.cfg/default || flag=1
sed -i “63aappend initrd=initrd.img inst.repo=http://$1/iso ks=http://$1/pub/ks.cfg quiet” /var/lib/tftpboot/pxelinux.cfg/default || flag=1
sed -i ’70d’ /var/lib/tftpboot/pxelinux.cfg/default || flag=1
sed -i “69aappend initrd=initrd.img inst.repo=http://$1/iso rd.live.check ks=http://$1/pub/ks.cfg quiet” /var/lib/tftpboot/pxelinux.cfg/default || flag=1
status $flag “4.开机选项配置”
mkdir /var/www/html/iso && echo -e “\033[32m 5.服务目录创建成功! \033[0m” || echo -e “\033[31m 5.服务目录创建失败! \033[0m”
echo -e “\033[34m 以下拷贝时间较长,请耐心等待… \033[0m”
cp -r /media/cdrom/* /var/www/html/iso/ && echo -e “\033[32m 6.光盘镜像已拷贝到http工作目录下! \033[0m” || echo -e “\033[31m 6.光盘镜像拷贝失败! \033[0m”
firewall-cmd –permanent –add-port=69/udp && echo -e “\033[32m (tftp放行成功!) \033[0m” || echo -e “\033[31m (tftp放行失败!) \033[0m”
firewall-cmd –reload
mkdir /var/www/html/pub && echo -e “\033[32m 7.应答目录创建成功! \033[0m” || echo -e “\033[31m 7.应答目录创建失败! \033[0m”
cp ~/anaconda-ks.cfg /var/www/html/pub/ks.cfg && echo -e “\033[32m 8.应答文件已拷贝! \033[0m” || echo -e “\033[31m 8.应答文件拷贝失败! \033[0m”
chmod +r /var/www/html/pub/ks.cfg && echo -e “\033[32m 9.应答文件已授权! \033[0m” || echo -e “\033[31m 9.应答文件未授权! \033[0m”
firewall-cmd –permanent –add-service=http && echo -e “\033[32m 10.防火墙已放行! \033[0m” || echo -e “\033[31m 10.防火墙未放行 \033[0m”
firewall-cmd –reload
flag=0
line=`sed -n ‘/cdrom/=’ /var/www/html/pub/ks.cfg`
sed -i “$line{s!cdrom!url –url=http://$1/iso!g}” /var/www/html/pub/ks.cfg && `flag=1`
sed -i “s/^.*timezone .*$/timezone Asia\/Shanghai –isUtc/” /var/www/html/pub/ks.cfg && `flag=1`
line=`sed -n ‘/–none/=’ /var/www/html/pub/ks.cfg`
sed -i “$line{s!–none!–all!g}” /var/www/html/pub/ks.cfg && `flag=1`
status $flag “11.镜像安装参数配置”
Divider
#####服务启动模块#####
systemctl restart dhcpd && echo -e “\033[32m 1.DHCP服务开启成功! \033[0m” || echo -e “\033[31m 1.DHCP服务开启失败! \033[0m”
systemctl enable dhcpd
systemctl restart tftp && echo -e “\033[32m 2.TFTP服务开启成功! \033[0m” || echo -e “\033[31m 2.TFTP服务开启失败! \033[0m”
systemctl enable tftp
systemctl restart xinetd && echo -e “\033[32m 3.Xinetd服务开启成功! \033[0m” || echo -e “\033[31m 3.Xinetd服务开启失败! \033[0m”
systemctl enable xinetd
systemctl restart httpd && echo -e “\033[32m 4.HTTP服务开启成功! \033[0m” || echo -e “\033[31m 4.HTTP服务开启失败! \033[0m”
systemctl enable httpd
str=`ifconfig | sed -n ‘1p’`
str1=`echo ${str%%:*}`
nmcli connection modify $str1 ipv4.method manual ipv4.addresses $1/24 ipv4.gateway “” ipv4.dns “” connection.autoconnect yes && echo -e “\033[32m 5.网卡已重新配置! \033[0m” || echo -e “\033[31m 5.网卡配置失败,请自行修改ip地址为$1 \033[0m”
nmcli connection up $str1
echo -e “\033[34m 脚本执行完毕!!!\n \033[0m”
Divider

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
配置文件
dhcpd1.conf
防DHCP报错的,挺废的,当然是本人太菜了,不过这能解决问题!

ddns-update-style none;
ignore client-updates;
range 192.168.4.50 192.168.4.250;
option routers 192.168.4.1;
option domain-name “www.baidu.com”;
option domain-name-servers 192.168.4.1;
default-lease-time 21600;
max-lease-time 43200;
}
1
2
3
4
5
6
7
8
9
dhcpd2.conf
正式的DHCP配置文件,为啥不写在脚本里?不想!

allow booting;
allow bootp;
ddns-update-style interim;
ignore client-updates;
range dynamic-bootp 192.168.4.50 192.168.4.200;
default-lease-time 21600;
max-lease-time 43200;
filename “pxelinux.0”;
}
1
2
3
4
5
6
7
8
9
脚本使用方法:sh autoIS.sh [服务器IP]
警告:
1.在服务器上做实验的,记得连接虚拟光盘!
2.脚本执行会更改网卡配置,执行完不能上网,是很有可能的,用nmtui来恢复网卡配置就ok!

当然!这个脚本太基础了,你也可以在这个脚本的基础上加些东西,比如环境监测之类的!

文章知识点与官方知识档案匹配,可进一步学习相关知识
CS入门技能树Linux环境安装安装CentOS1660 人正在系统学习中
————————————————
版权声明:本文为CSDN博主「八宝茶&黑兰州」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_43233084/article/details/114643017

ImageMagick 图片处理常用实例简介

 发表于 2019-04-11 |  分类于 Tools |  |  阅读次数: 字数统计: 3.8k |  阅读时长 ≈ 0:04

ImageMagick 是一整套用于图像处理的跨平台的命令行工具,大部分 Linux 发行版都可以直接通过包管理器安装(如 Ubuntu 系统:sudo apt-get install imagemagick)。其他平台也可以从官网下载对应的编译好的程序。
通过命令行,ImageMagick 可以很高效的对图片进行编辑、转换和创作,也支持批量处理多张图片,或者内嵌到 Bash 脚本中。
这里简单介绍下 ImageMagick 常见的几种用法。

格式转换

ImageMagick 提供了 convert 命令用于接收图片文件并对其进行特定的操作后输出。其中最基本的用法即改变图片的格式。

如将 PNG 格式的图片转为 JPEG 格式:
$ convert image.png image.jpg

对于 JPEG 图片,在转换时还可以指定压缩等级,如:
$ convert image.png -quality 95 image.jpg

其中压缩等级(-quality)的值为 1-100,默认使用输入图片的压缩等级。如该值为空,则压缩等级默认为 92 。

改变图片大小

convert 命令还可以用来改变图片的大小。如下面的命令可以将原图片转成大小为 200×100 像素的图片:
$ convert image.png -resize 200x100 out.png

需要注意的是,在上面的命令中,ImageMagick 会优先保持原图片的比例(否则图片会发生一定程度的变形)。这样的结果是,改变后的图片可以正好放进一个 200×100 大小的区域,但图片本身并不一定是精确的 200×100 像素。

如果就是需要将原图片转换为特定大小,而不用考虑形变的影响。可以使用如下命令:
$ convert image.png -resize 200x100! out.png

当然更多的时候,指定输出图片的大小时并非一定需要“宽x高”这样的形式,其实只需要指定宽或者高中的一项即可。如指定输出图片的宽度:
$ convert image.png -resize 200 out.png

或者指定输出图片的高度:
$ convert image.png -resize x100 out.png

旋转与翻转

将原图片旋转 90° 后输出:
$ convert image.jpg -rotate 90 image-rotated.jpg

指定的角度为正时即顺时针旋转图片,为负时逆时针旋转。

左右翻转:
$ convert image.png -flop out.png
上下翻转:
$ convert image.png -flip out.png

PS:包括前面的几种情况在内,如果输出图片的文件名和原图片相同,则改变后的图片会直接覆盖掉原图片。

裁剪与缩放

convert 命令支持等比例缩放图片,如将图片缩小为原来的一半:
$ convert image.png -scale 50% out.png

同时 convert 也可以对图片进行裁剪,包括自动裁剪(剔除图片周围空白的部分或边框等)和自定义范围的裁剪。

自动裁剪$ convert image.png -trim out.png
trim

自定义裁剪$ convert image.jpg -crop 600x600+240+240 out.jpg
crop

其中 -crop 的参数为 宽x高+横坐标偏移量+纵坐标偏移量 的形式,即宽和高用来定义裁剪的矩形区域的范围,横纵偏移量用来指定裁剪区域的相对位置(都为 0 时表示从最左上角开始)。

需要注意的是,当用 -crop 选项裁剪 PNG 和 GIF 格式的图片时(这两种格式的图片包含“虚拟画布”),并不是以画面的实际像素为基准,而是需要参考“画布”的大小和位置,所以有时候并不会达到预期的效果。
详细介绍可参考官方文档 Cutting and Bordering 。

shave

裁剪图片有时候可以采取相反的思路,即剔除图片中不需要的部分:
$ convert image.png -shave 100x50 out.png
将输入图片的左右两边剔除 100 像素,上下两边剔除 50 像素,获取剩余的部分并输出。

色彩、亮度与饱和度

convert 命令可以通过 -modulate 选项调整图片的色彩、亮度和饱和度。如:
$ convert image.png -modulate 150,100,100 out.png

上述命令会将原图片的亮度增大为原来的 150% 。其中 150,100,100 三个数值分别表示亮度、饱和度和色相
100 为基准值,即大于 100 表示增强某种属性,小于 100 表示减弱某种属性。

透明度、色彩与位深度

  • 将透明(alpha)通道替换为纯黑色:$ convert image.png -flatten out.png
  • 将原彩色图片转为灰度模式:$ convert image.png -type Grayscale out.png
  • 降低图片的位深度(bits per pixel):$ convert image.png -depth 8 out.png
  • 减少图片色彩:$ convert image.png -dither -colors 256 out.png

PSdither 会增加像素点,如需要在减少色彩的同时不应用 dither 效果,将命令中的 -dither 替换为 +dither 。

锐化与虚化

锐化
$ convert image.png -sharpen 2 out.png

模糊
$ convert image.png -blur 1 out.png

添加文字和边框

添加水印
$ convert image.jpg -fill red -draw "text 20 20 '© 2019 example.com'" out.jpg

可以自行定义添加文字的位置(默认为左上角)和字体类型:
$ convert image.jpg -fill red -gravity SouthEast -font arial -draw "text 20 20 '© 2019 example.com'" out.jpg

添加边框
$ convert image.png -bordercolor blue -border 50 out.png
其中 -bordercolor 用于指定边框颜色,-border 用于指定边框宽度,可以为百分比。

组合叠加

组合多张图片(垂直方向)
$ convert x1.png x2.png x3.png -append out.png

组合多张图片(水平方向)
$ convert x1.png x2.png x3.png +append out.png

叠加图片
$ composite -gravity center img1.png img2.png out.png
将 img1.png 叠加到 img2.png 上并作为 out.png 输出(方位为正中间)

应用效果

ImageMagick 可以对图片应用多种样式的特效。如 “charcoal” 效果:
$ convert image.png -charcoal 2 out.png
Charcoal
其中 -charcoal 后面的数字 2 用于指定该效果的强度。

“implode” 效果:
$ convert image.png -implode 1 out.png
Implode

结合多种操作

前面提到的多种处理方式实际上可以任意组合使用,使得只用一条命令即可以同时完成多种操作。如:
$ convert image.png -resize 400x400 -rotate 180 -charcoal 4 -quality 95 out.jpg
Combination

批量处理

借助 Bash 脚本(Linux 系统)的强大功能,ImageMagick 可以很方便的批量处理多张图片。
如下面的命令可以查找当前目录下所有的 PNG 图片,将它们每一张都旋转 90°,再将原文件名添加 “rotated-” 前缀后保存:
$ for file in *.png; do convert $file -rotate 90 rotated-$file; done

Windows 系统上是没有原生的 Bash Shell 的,但是可以下载安装某些软件以支持 Bash 环境,比如 Git for Windows
其实使用 Windows 系统自带的 PowerShell 也可以完成同样的批量操作:
PS > dir *.png | foreach { convert $_ -rotate 90 rotated-$($_.basename).png }
Batch Processing

有兴趣的话,可以多玩几下。

GIF 动图制作

可以借助 convert 命令将多张图片组合为一张重复播放的 GIF 动图:
$ convert -delay 20 -loop 0 *.png out.gif

其中 -delay 选项用于指定图片切换的时间间隔,单位为毫秒

参考文章

ImageMagick Tutorial
ImageMagick basics

拓展阅读

Examples of ImageMagick Usage(很详细)

Linux下环境变量配置方法小结(.bash_profile和.bashrc的区别)

这篇文章主要介绍了Linux下环境变量配置方法小结(.bash_profile和.bashrc的区别),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

linux系统下,如果下载并安装了应用程序,在启动时很有可能在键入它的名称时出现”command not found”的提示内容。如果每次都到安装目标文件夹内,找到可执行文件

来进行操作就太繁琐了,这种情况下就涉及到环境变量PATH的设置问题,而PATH的设置也是在linux下定制环境变量的一个组成部分。

环境变量配置的两个方法:

1)修改/etc/profile文件

推荐使用这种方法,因为所有用户的shell都有权使用这些环境变量,缺点是可能会给系统带来安全性问题。 这里是针对所有的用户的,所有的shell;

[root@test ~]# vim /etc/profile
….
export PATH=$PATH:/usr/local/mysql/bin

使用source命令使修改立刻生效:
[root@test ~]# source  /etc/profile

2)修改.bashrc文件,这种方法更为安全,它可以把使用这些环境变量的权限控制到用户级别,这里是针对某一个特定的用户,如果需要给某个用户权限
使用这些环境变量,只需要修改其个人用户主目录下的.bashrc文件就可以了。
[root@test ~]# vim /root/.bashrc
export PATH=$PATH:/usr/local/mysql/bin

[root@test ~]# source  /root/.bashrc

需要注意的是:

在/etc/profile里设置系统环境变量时,路径末尾不能以”/”结尾,否则将导致整个PATH变量出错。

[app@test ~]$ vim ~/.bashrc
……
KETTLE_HOME=/data/nstc/kettle3.2
export KETTLE_HOME

注意:配置好环境变量后,要记得export输出这个变量,否则如下source后无效!
[app@test ~]$ source .bashrc //使之生效
[app@test ~]$ echo $KETTLE_HOME
/data/nstc/kettle3.2
[app@test ~]$ env
………
KETTLE_HOME=/data/nstc/kettle3.2

.bash_profile和.bashrc的区别:

/etc/profile: 此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.并从/etc/profile.d目录的配置文件中搜集shell的设置.
/etc/bashrc:  为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取.
~/.bash_profile: 每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件.
~/.bashrc: 该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取.
~/.bash_logout: 当每次退出系统(退出bash shell)时,执行该文件.

另外,/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承/etc/profile中的变量,他们是”父子”关系.

=========================设置终端登录超时时间================

远程登录linux服务器,如何设置终端失效时间(即过了多久不操作,终端即将失效)。方法如下:
[root@mq-console-nameserver ~]# vim /etc/profile
……
export TMOUT=600
[root@mq-console-nameserver ~]# source /etc/profile

如上设置后,登录这台服务器的终端在10分钟内不做操作,则该终端就将失效!

总结

LINUX iconv命令详解

功能] 

对于给定文件把它的内容从一种编码转换成另一种编码。 

[描述] 

-f encoding :把字符从encoding编码开始转换。 

-t encoding :把字符转换到encoding编码。 

-l :列出已知的编码字符集合 

-o file :指定输出文件 

-c :忽略输出的非法字符 

-s :禁止警告信息,但不是错误信息 

–verbose :显示进度信息 

-f和-t所能指定的合法字符在-l选项的命令里面都列出来了。 

 

[举例] 

*列出当前支持的字符编码: 

#iconv -l

*将文件file1转码,转后文件输出到fil2中: 

#iconv  -f EUC-JP-MS -t UTF-8 file1 -o file2   //没-o那么会输出到标准输出.

*实际需求,从hive中取出的数据是utf8的,要load到mysql中,gbk编码。所以在load之前要先对文件进行转码。

复制代码
mysql_cmd = "iconv -c -f utf-8 -t gbk ./data/al_ver_" + yesterday_time + ".xls -o ./data/GBK_al_ver_" + yesterday_time + ".xls "
print(mysql_cmd)
os.system(mysql_cmd)
 
mysql_cmd = "mysql -h60.28.200.78 -uroot -pyeelion -A LogStat_RT  -e \"load data local  infile \'./data/GBK_al_ver_" + yesterday_time + ".xls ' into table HiveData_508\""
print(mysql_cmd)
os.system(mysql_cmd)

在php中iconv函数库能够完成各种字符集间的转换,是php编程中不可缺少的基础函数库;但有时候iconv对于部分数据转码会无缘无故的少一些。比如在转换字符”—”到gb2312时会出错。

下面一起慢慢看一下这个函数的用法。

最简单的应用,把gb2312置换成utf-8:

1
$text=iconv("GB2312","UTF-8",$text);

在用$text=iconv("UTF-8","GB2312",$text)过程中,如果遇到一些特别字符时,如:”—”,英文名中的”.”等等字符,转换就断掉了。这些字符后的文字都没法继续转换了。

针对这的问题,可以用如下代码实现:

1
$text=iconv("UTF-8","GBK",$text);

你没有看错,就这么简单,不使用gb2312,而写成GBK,就可以了。

还有一种方法,第二个参数,加上//IGNORE,忽略错误,如下:

1
iconv("UTF-8","GB2312//IGNORE",$data);

没有具体比较这两种方法,感觉第一种(GBK代替gb2312)方法更好。

php手册中iconv() 说明:

iconv

(PHP 4 >= 4.0.5, PHP 5)
iconv – Convert string to requested character encoding
Description
string iconv ( string in_charset, string out_charset, string str )
Performs a character set conversion on the string str from in_charset to out_charset. Returns the converted string or FALSE on failure.
If you append the string //TRANSLIT to out_charset transliteration is activated. This means that when a character can’t be represented in the target charset, it can be approximated through one or several similarly looking characters. If you append the string //IGNORE, characters that cannot be represented in the target charset are silently discarded. Otherwise, str is cut from the first illegal character.

在使用这个函数进行字符串编码转换时,需要注意,如果将utf-8转换为gb2312时,可能会出现字符串被截断的情况发生。此时可以使用以下方法解决:

1
$str=iconv('utf-8',"gb2312//TRANSLIT",file_get_contents($filepath));

即在第二个参数出添加红色字部分,表示:如果在目标编码中找不到与源编码相匹配的字符,会选择相似的字符进行转换。此处也可以使用://IGNORE 这个参数,表示忽略不能转换的字符。

ignore的意思是忽略转换时的错误,如果没有ignore参数,所有该字符后面的字符串都无法被保存。

iconv不是php的默认函数,也是默认安装的模块。需要安装才能用的。

如果是windows2000+php,你可以修改php.ini文件,将extension=php_iconv.dll前的”;”去掉,同时你要copy你的原php安装文件下的iconv.dll到你的winnt/system32下(如果你的dll指向的是这个目录)。在linux环境下,用静态安装的方式,在configure时加多一项 –with-iconv就可以了,phpinfo看得到iconv的项。(Linux7.3+Apache4.06+php4.3.2)。

mb_convert_encoding与iconv函数介绍

mb_convert_encoding这个函数是用来转换编码的。原来一直对程序编码这一概念不理解,不过现在好像有点开窍了。不过英文一般不会存在编码问题,只有中文数据才会有这个问题。比如你用Zend Studio或Editplus写程序时,用的是gbk编码,如果数据需要入数据库,而数据库的编码为utf8时,这时就要把数据进行编码转换,不然进到数据库就会变成乱码。

做一个GBK To UTF-8:

1
2
3
4
<?php
header("content-Type: text/html; charset=Utf-8");
echo mb_convert_encoding("妳係我的友仔", "UTF-8", "GBK");
?>

再来个GB2312 To Big5:

1
2
3
4
<?php
header("content-Type: text/html; charset=big5");
echo mb_convert_encoding("你是我的朋友", "big5", "GB2312");
?>

不过要使用上面的函数需要安装但是需要先enable mbstring 扩展库。

string mb_convert_encoding ( string str, string to_encoding [, mixed from_encoding] )需要先enable mbstring 扩展库,在 php.ini里将; extension=php_mbstring.dll 前面的 ; 去掉mb_convert_encoding 可以指定多种输入编码,它会根据内容自动识别,但是执行效率比iconv差太多;

string iconv ( string in_charset, string out_charset, string str )注意:第二个参数,除了可以指定要转化到的编码以外,还可以增加两个后缀://TRANSLIT 和 //IGNORE,其中 //TRANSLIT 会自动将不能直接转化的字符变成一个或多个近似的字符,//IGNORE 会忽略掉不能转化的字符,而默认效果是从第一个非法字符截断。

一般情况下用 iconv,只有当遇到无法确定原编码是何种编码,或者iconv转化后无法正常显示时才用mb_convert_encoding 函数。

1
2
$content = iconv("GBK", "UTF-8″, $content);
$content = mb_convert_encoding($content, "UTF-8″, "

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

linux bash if语句

str1 = str2      当两个串有相同内容、长度时为真
str1 != str2      当串str1和str2不等时为真
-n str1        当串的长度大于0时为真(串非空)
-z str1        当串的长度为0时为真(空串)
str1           当串str1为非空时为真

[ “2006.01.23” \> “2005.03.01” ] && echo dayu || echo budayu

int1 -eq int2    两数相等为真
int1 -ne int2    两数不等为真
int1 -gt int2    int1大于int2为真
int1 -ge int2    int1大于等于int2为真
int1 -lt int2    int1小于int2为真
int1 -le int2    int1小于等于int2为真

-r file     用户可读为真
-w file     用户可写为真
-x file     用户可执行为真
-f file     文件为正规文件为真
-d file     文件为目录为真
-c file     文件为字符特殊文件为真
-b file     文件为块特殊文件为真
-s file     文件大小非0时为真
-t file     当文件描述符(默认为1)指定的设备为终端时为真

-a         与
-o        或
!        非

 

上面的三种写在括号内,对应的 && || 写在中括号之间。例如,if  [   “$a”  eq   1  -o  “$b” eq 2 ]  &&  [   “$c”  eq  3 ]

4字符串匹配

if [  `echo $str | grep -e regexp`  ];then .

 

转自:http://hi.baidu.com/ryouaki/item/0689dcb8a467b5a7eaba9319

二 具体使用

比较两个字符串是否相等的办法是:

    if [ “$test”x = “test”x ]; then

这里的关键有几点:

1 使用单个等号

2 注意到等号两边各有一个空格:这是unix shell的要求

3 注意到”$test”x最后的x,这是特意安排的,因为当$test为空的时候,上面的表达式就变成了x = testx,显然是不相等的。而如果没有这个x,表达式就会报错:[: =: unary operator expected

 

二元比较操作符,比较变量或者比较数字.注意数字与字符串的区别.

    整数比较 需要注意的是 要么使用[]gt组合 要么使用大于号和双括号组合

-eq 等于,如:if [ “$a” -eq “$b” ]

-ne 不等于,如:if [ “$a” -ne “$b” ]

-gt 大于,如:if [ “$a” -gt “$b” ]

-ge 大于等于,如:if [ “$a” -ge “$b” ]

-lt 小于,如:if [ “$a” -lt “$b” ]

-le 小于等于,如:if [ “$a” -le “$b” ]

大于(需要双括号),如:((“$a” > “$b”))

>= 大于等于(需要双括号),如:((“$a” >= “$b”))

小数据比较可使用AWK

字符串比较

= 等于,如:if [ “$a” = “$b” ]

== 等于,如:if [ “$a” == “$b” ],与=等价

注意:==的功能在[[]]和[]中的行为是不同的,如下:

1 [[ $a == z* ]] # 如果$a以”z”开头(模式匹配)那么将为true

2 [[ $a == “z*” ]] # 如果$a等于z*(字符匹配),那么结果为true

3

4 [ $a == z* ] # File globbing 和word splitting将会发生

5 [ “$a” == “z*” ] # 如果$a等于z*(字符匹配),那么结果为true

一点解释,关于File globbing是一种关于文件的速记法,比如”*.c”就是,再如~也是.

但是file globbing并不是严格的正则表达式,虽然绝大多数情况下结构比较像.

!= 不等于,如:if [ “$a” != “$b” ]

这个操作符将在[[]]结构中使用模式匹配.

大于,在ASCII字母顺序下.如:

if [[ “$a” > “$b” ]]

if [ “$a” \> “$b” ]

注意:在[]结构中”>”需要被转义.

具体参考Example 26-11来查看这个操作符应用的例子.

-z 字符串为”null”.就是长度为0.

-n 字符串不为”null”

注意:

使用-n在[]结构中测试必须要用””把变量引起来.使用一个未被””的字符串来使用! -z

或者就是未用””引用的字符串本身,放到[]结构中。虽然一般情况下可

以工作,但这是不安全的.习惯于使用””来测试字符串是一种好习惯.

if判断式
if [ 条件判断一 ] && (||) [ 条件判断二 ]; then
elif [ 条件判断三 ] && (||) [ 条件判断四 ]; then
else
   执行第三段內容程式
fi

例如:

 

root@Bizbox:~# a=0

root@Bizbox:~# b=0

root@Bizbox:~# c=5

root@Bizbox:~# if [ $a = 0 -a $b = 0 ]&&[ $c != 0 ]; then

> echo success

> fi

success

if 使用的表达式

http://www.cnblogs.com/276815076/archive/2011/10/30/2229286.html

if 语句格式
if  条件
then
Command
else
Command
fi                              别忘了这个结尾 If语句忘了结尾fi
test.sh: line 14: syntax error: unexpected end of fi
if 的三种条件表达式
if
command
then
if
函数
then  命令执行成功,等于返回0 (比如grep ,找到匹配)
执行失败,返回非0 (grep,没找到匹配) if [ expression_r_r_r  ]
then   表达式结果为真,则返回0,if把0值引向then if test expression_r_r_r
then  表达式结果为假,则返回非0,if把非0值引向then
[ ] &&  ——快捷if
[ -f “/etc/shadow” ] && echo “This computer uses shadow passwors”    && 可以理解为then
如果左边的表达式为真则执行右边的语句
shell的if与c语言if的功能上的区别
shell if     c语言if 0为真,走then  正好相反,非0走then  不支持整数变量直接if
必须:if [ i –ne 0 ]

但支持字符串变量直接if
if [ str ] 如果字符串非0  支持变量直接if
if (i )

echo –n “input:”
read user

if
多条指令,这些命令之间相当于“and”(与)
grep $user /etc/passwd >/tmp/null
who -u | grep $user
then             上边的指令
都执行成功,返回值$?为0,0为真,运行then
echo “$user has logged”
else     指令执行失败,$?为1,运行else
echo “$user has not logged”
fi   

# sh test.sh
input : macg
macg     pts/0        May 15 15:55   .          2075 (192.168.1.100)
macg has logged

# sh test.sh
input : ddd
ddd has not logged

以函数作为if条件  (函数就相当于command,函数的优点是其return值可以自定义)
if
以函数作为if条件,
getyn
then   函数reture值0为真,走then
echo ” your answer is yes”
else  函数return值非0为假,走else
echo “your anser is no”
fi
if command  等价于 command+if $?
$ vi testsh.sh
#!/bin/sh

if
cat 111-tmp.txt | grep ting1
then
echo found
else
echo “no found”
fi  $ vi testsh.sh
#!/bin/sh

cat 111-tmp.txt | grep ting1

if [ $? -eq 0 ]
then
echo $?
echo found
else
echo $?
echo “no found”
fi $ sh testsh.sh
no found   $ sh testsh.sh
1
no found $ vi 111-tmp.txt
that is 222file
thisting1 is 111file

$ sh testsh.sh
thisting1 is 111file
found $ vi 111-tmp.txt
that is 222file
thisting1 is 111file

$ sh testsh.sh
thisting1 is 111file
0
found

条件表达式

  • 文件表达式

 ]    如果文件存在且可写
if [ -x file  ]    如果文件存在且可执行   

整数变量表达式    字符串变量表达式

 [ $a = $b ]                 如果string1等于string2
[ $string1 !=  $string2 ]   如果string1不等于string2        if  [ -n $string  ]             如果string 非空(非0),返回0(true)
if  [ -z $string  ]             如果string 为空
if  [ $sting ]                  如果string 非空,返回0 (和-n类似)

if [ a = b ] ;then
echo equal
else
echo no equal
fi

[macg@machome ~]$ sh test.sh
input a:
5
input b:
5
no equal  (等于表达式没比$a$b,而是比ab,自然a!=b)

if [ $a = $b ] ;then
echo equal
else
echo no equal
fi

[macg@machome ~]$ sh test.sh
input a:
5
input b:
5
equal

                                                                                    [macg@machome ~]$ vi test.sh
echo -n “input your choice:”
read var
if  [ $var -eq “yes” ]
then
echo $var
fi
[macg@machome ~]$ sh -x test.sh
input your choice:
y
test.sh: line 3: test: y: integer expression_r_r_r expected
期望整数形式,即-eq不支持字符串

=放在别的地方是赋值,放在if [ ] 里就是字符串等于,shell里面没有==的,那是c语言的等于

    [macg@machome ~]$ vi test.sh
echo “input a:”
read a
echo “input is $a”
if [ $a = 123 ] ; then
echo equal123
fi

[macg@machome ~]$ sh test.sh
input a:
123
input is 123
equal123

   = 作为等于时,其两边都必须加空格,否则失效
等号也是操作符,必须和其他变量,关键字,用空格格开 (等号做赋值号时正好相反,两边不能有空格)
[macg@machome ~]$ vi test.sh

echo “input your choice:”
read var
if [ $var=”yes” ]
then
echo $var
echo “input is correct”
else
echo $var
echo “input error”
fi [macg@machome ~]$ vi test.sh

echo “input your choice:”
read var
if [ $var = “yes” ]   在等号两边加空格
then
echo $var
echo “input is correct”
else
echo $var
echo “input error”
fi [macg@machome ~]$ sh test.sh
input your choice:
y
y
input is correct
[macg@machome ~]$ sh test.sh
input your choice:
n
n
input is correct
输错了也走then,都走then,为什么?

因为if把$var=”yes”连读成一个变量,而此变量为空,返回1,则走else  [macg@machome ~]$ sh test.sh
input your choice:
y
y
input error
[macg@machome ~]$ sh test.sh
input your choice:
no
no
input error
一切正常 

If  [  $ANS  ]     等价于  if [ -n $ANS ]
如果字符串变量非空(then) , 空(else)
echo “input your choice:”
read ANS

if [ $ANS ]
then
echo no empty
else
echo empth
fi  [macg@machome ~]$ sh test.sh
input your choice:                       回车

empth                                    说明“回车”就是空串
[macg@machome ~]$ sh test.sh
input your choice:
34
no empty
整数条件表达式,大于,小于hell里没有> 和< ,会被当作尖括号,只有-ge,-gt,-le,lt
[macg@machome ~]$ vi test.sh

echo “input a:”
read a
if  [ $a -ge 100 ] ; then
echo 3bit
else
echo 2bit
fi [macg@machome ~]$ sh test.sh
input a:
123
3bit
[macg@machome ~]$ sh test.sh
input a:
20
2bit
if  test $a  ge 100 ; then

[macg@machome ~]$ sh test.sh
test.sh: line 4: test: ge: binary operator expected

if  test $a -ge 100 ; then

[macg@machome ~]$ sh test.sh
input a:
123
3bit

    逻辑非 !                   条件表达式的相反
if [ ! 表达式 ]
if [ ! -d $num ]                        如果不存在目录$num

逻辑与 –a条件表达式的并列
if [ 表达式1  –a  表达式2 ]

–o 表达式2 ]

逻辑表达式

  •     表达式与前面的=  != -d –f –x -ne -eq -lt等合用

逻辑符号就正常的接其他表达式,没有任何括号( ),就是并列

注意逻辑与-a与逻辑或-o很容易和其他字符串或文件的运算符号搞混了

 

[macg@mac-home ~]$ vi test.sh
:
echo “input the num:”
read num
echo “input is $num”

if [ -z “$JHHOME” -a -d $HOME/$num ]   如果$JHHOME为空,且$HOME/$num存在
then
JHHOME=$HOME/$num                      
则赋值
fi

echo “JHHOME is $JHHOME”  

———————–
[macg@mac-home ~]$ sh test.sh
input the num:
ppp
input is ppp
JHHOME is

目录-d $HOME/$num   不存在,所以$JHHOME没被then赋值

[macg@mac-home ~]$ mkdir ppp
[macg@mac-home ~]$ sh test.sh
input the num:
ppp
input is ppp
JHHOME is /home/macg/ppp

echo “input your choice:”
read ANS

if [ $ANS=”Yes” -o $ANS=”yes” -o $ANS=”y” -o $ANS=”Y” ]
then
ANS=”y”
else
ANS=”n”
fi

echo $ANS

[macg@machome ~]$ sh test.sh
input your choice:
n
y
[macg@machome ~]$ sh test.sh
input your choice:
no
y
为什么输入不是yes,结果仍是y(走then)
因为=被连读了,成了变量$ANS=”Yes”,而量又空,所以走else

[macg@machome ~]$ vi test.sh

echo “input your choice:”
read ANS    echo “input your choice:”
read ANS

if [ $ANS = “Yes” -o $ANS = “yes” -o $ANS = “y” -o $ANS = “Y” ]
then
ANS=”y”
else
ANS=”n”
fi

echo $ANS [macg@machome ~]$ sh test.sh
input your choice:
no
n
[macg@machome ~]$ sh test.sh
input your choice:
yes
y
[macg@machome ~]$ sh test.sh
input your choice:
y
y
test 
条件表达式 作为if条件===================================
if test $num -eq 0      等价于   if [ $num –eq 0 ]
test  表达式,没有 [  ]
if test $num -eq 0
man test
[macg@machome ~]$ man test
[(1)                             User Commands                            [(1)

SYNOPSIS
test EXPRESSION
[ EXPRESSION ]

[-n] STRING
the length of STRING is nonzero          -n和直接$str都是非0条件

-z STRING
the length of STRING is zero

STRING1 = STRING2
the strings are equal

STRING1 != STRING2
the strings are not equal

INTEGER1 -eq INTEGER2
INTEGER1 is equal to INTEGER2

INTEGER1 -ge INTEGER2
INTEGER1 is greater than or equal to INTEGER2

INTEGER1 -gt INTEGER2
INTEGER1 is greater than INTEGER2

INTEGER1 -le INTEGER2
INTEGER1 is less than or equal to INTEGER2

INTEGER1 -lt INTEGER2
INTEGER1 is less than INTEGER2

INTEGER1 -ne INTEGER2
INTEGER1 is not equal to INTEGER2

FILE1 -nt FILE2
FILE1 is newer (modification date) than FILE2

FILE1 -ot FILE2
FILE1 is older than FILE2

-b FILE
FILE exists and is block special

-c FILE
FILE exists and is character special

-d FILE
FILE exists and is a directory

-e FILE
FILE exists                                 文件存在

-f FILE
FILE exists and is a regular file     文件存在且是普通文件

-h FILE
FILE exists and is a symbolic link (same as -L)

-L FILE
FILE exists and is a symbolic link (same as -h)

-G FILE
FILE exists and is owned by the effective group ID

-O FILE
FILE exists and is owned by the effective user ID

-p FILE
FILE exists and is a named pipe

-s FILE
FILE exists and has a size greater than zero

-S FILE
FILE exists and is a socket

-w FILE
FILE exists and is writable

-x FILE
FILE exists and is executable

&& 如果是“前面”,则“后面”
[ -f /var/run/dhcpd.pid ] && rm /var/run/dhcpd.pid    检查 文件是否存在,如果存在就删掉

   ||   如果不是前面后面 [ -f /usr/sbin/dhcpd ] || exit 0    检验文件是否存在,如果存在就退

     [ -z “$1” ] && help                 如果第一个参数不存在(-z  字符串长度为0 )
[ “$1” = “-h” ] && help                        如果第一个参数是-h,就显示help

例子
#!/bin/sh
[ -f “/etc/sysconfig/network-scripts/ifcfg-eth1” ] && rm -f /etc/sysconfig/network-scripts/ifcfg-eth1cp ifcfg-eth1.bridge /etc/sysconfig/network-scripts/ifcfg-eth1 [ -f “/etc/sysconfig/network-scripts/ifcfg-eth0:1” ] && rm -f /etc/sysconfig/network-scripts/ifcfg-eth0:1

linux(ls、wc、ln、source、bash、du、touch、绝对路径、相对路径)新手速成指导

目录

1、ls

1.1、ls -a

1.2、ll -a或者ls -a -l

1.3、查看文件夹及文件的各种权限

1.4、chmod +/- x/r/w +文件

1.5、ln -s 文件1(源文件) 文件2(链接文件)

1.6、ls -l -h

2、wc

2.1、wc -w

2.2、wc -l

3、|

4、cat /etc/passwd

5、alias

5.1、 unalias

5.2、如果定义的别名和原linux系统里的命令冲突,会怎样

5.2.1、怎么解决冲突问题呢?

6、vim

6.1、永久修改别名

6.2、执行脚本

6.2.1、source和bash执行脚本的区别?

6.2.2、输出全局变量

6.2.3、bash和source的图片说明

6.2.4、exit

6.3、变量的定义规则

6.3.1、关键字

7、安装python3

7.1、查看python里边的关键字

7.2、退出python的方法

8、du

9、相对路径和绝对路径​

9.1、绝对路径

9.2、相对路径

10、touch

10.1、使用touch创建多个文件

11、date

12、rm

12.1、通配符

12.2、rm -rf 的绝对注意事项

13、read

13.1、read -p

13.2、使用read 给多个变量赋值

14、编写一个脚本实现新建100个指定前缀的文件和100个文件夹

14.1、使变量

15、练习
————————————————
版权声明:本文为CSDN博主「FanMY_71」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_48638643/article/details/121734189

 

 

LINUX tree命令:文件目录结构以树形显示

tree命令可以使文件目录以树形结构显示,非常适合于给别人介绍我们的文件目录的组成框架,而且该命令使用适当的参数可以将命令结果输出到指定路径下的指定文件中保存。
注:此处以centos 7系统为例,在centos 7系统中默认是没有tree这个命令的,需要安装,用下面的命令就可以安装tree这个命令工具

 

sudo yum install tree

安装完成后使用 tree --help 命令可以查看tree命令的使用方法

一、常用指令

  1. tree -a 显示所有文件和目录
  2. tree -d 显示目录名称而非内容
  3. tree -f 在每个文件或目录之前,显示完整的相对路径名称
  4. tree -F 在执行文件,目录,Socket,符号连接,管道名称名称,各自加上”*”,”/”,”=”,”@”,”|”号
  5. tree -r 以相反次序排列
  6. tree -t 用文件和目录的更改时间排序
  7. tree -L n 只显示 n 层目录 (n 为数字)
  8. tree –dirsfirst 目录显示在前,文件显示在后

二、还可以加的参数

  1. -A 使用ASNI绘图字符显示树状图而非以ASCII字符组合
  2. -C 在文件和目录清单加上色彩,便于区分各种类型
  3. -D 列出文件或目录的更改时间
  4. -g 列出文件或目录的所属群组名称,没有对应的名称时,则显示群组识别码
  5. -i 不以阶梯状列出文件或目录名称
  6. -I 不显示符合范本样式的文件或目录名称
  7. -l 如遇到性质为符号连接的目录,直接列出该连接所指向的原始目录
  8. -n 不在文件和目录清单加上色彩
  9. -N 直接列出文件和目录名称,包括控制字符
  10. -p 列出权限标示
  11. -P 只显示符合范本样式的文件或目录名称
  12. -q 用”?”号取代控制字符,列出文件和目录名称
  13. -s 列出文件或目录大小
  14. -u 列出文件或目录的拥有者名称,没有对应的名称时,则显示用户识别码
  15. -x 将范围局限在现行的文件系统中,若指定目录下的某些子目录,其存放于另一个文件系统上,则将该子目录予以排除在寻找范围外

三、使用示例

1. 最简单的使用办法是直接输入tree命令,就会自动给我们以树形的形式列出当前目录的文件和文件夹,不加任何参数,它会自动列表当前目录下面所有深度级别的文件和目录
2. tree -L n ,n为数字,表示只查看当前第n级目录和文件
3. tree -L n -C 将目录和文件以不同的颜色区分
4. tree --dirsfirst -L n -C 目录在前文件在后以不同的颜色显示
5. tree --dirsfirst -L n -C -p 目录在前文件在后以不同的颜色显示,带属性

四、导出命令

 

tree --dirsfirst -L 2 -C >./test.md # 导出到当前目录下test.md文件中保存