使用pwd和ls查看当前目录及其内容只想获取当前目录的信息,可以键入pwd,不需要使用Nautilus,也可以使用teamviewer软件远程连接电脑,可以得到想要的一切。显示当前文件夹的路径。
终端是系统中一个应用程序,你可以直接在所有程序中找到它,点击打开就行。我比较喜欢使用聚焦搜索,输入「终端」或「Terminal」,看到终端被选中了按下回车即可。
快速打开终端
快速打开终端
基础知识
本节会从零开始,一步步讲解基础知识。若你只想查看实际命令,可以完全跳过这一部分。
终端启动后,就会进入一个问你要指令的状态,你只需要将指令输入在光标后,按下键盘回车,指令就会被执行。
那么什么是命令?命令就是你告诉电脑希望它做什么的那句话。若我现在希望告诉电脑说 hi,这句话的命令就是 say hi,就这么简单。
命令由三个部分组成,第一个部分是命令对象,在 say hi 这个命令中,「say」 是我们的命令对象,我们希望电脑说话;第二个部分是修饰命令对象的关键词,可有可无,若我希望电脑说话时慢一点,可以输入 say -r 500 hi,这里的 「-r 500」 则是修饰说话语速的关键词;第三部分是命令内容,这里填写希望电脑说的内容是「hi」这句话。
命令的组成
命令的组成
我们先来尝试让电脑将我们所打的话复述出来,这一步的指令是 echo "想说的话",将这句指令复制进终端并回车后,可以看到,它会将我们输入进去的文字在下一行重新打出来。
echo
echo
终端运行常常离不开对文件,文件夹的 *** 作。
当你需要使用终端对文件夹进行 *** 作时,终端需要你告诉它,你想要修改的文件在哪里,这时我们需要了解路径的概念。系统中的每一个文件都有一个存放位置,这一存放位置就称作路径。
终端启动后,它的默认路径在当前用户文件夹的根目录上,为了确定这一点,你可以输入 pwd 命令来查看当前路径。在下图中,输入命令后,终端告诉我当前路径是 /Users/我的名字。
pwd
pwd
路径的一般写法为 /文件夹名/文件夹名,但路径其实分为两种。一种叫相对路径,另一种叫绝对路径,它们两有什么区别呢?
我们从当前路径说起,当前路径指的是现在终端所处的位置,若你想改变当前路径,则可以输入 cd /其他文件夹。比如我希望系统将当前路径改为所有应用程序文件夹,则输入 cd /Applications,在下图中可以看到,Legolas 前出现了一个 Applications,表示当前路径已经在应用程序文件夹中。
cd /
cd /
刚刚提到的路径的一般写法 「/文件夹名/文件夹名」,它指的其实就是绝对路径,你必须指定它从根目录一直到达具体的文件夹。
与其相对的是相对路径,相对路径允许你告诉终端从现在开始,接下来应该怎么走。相对路径的书写方法实在绝对路径前加一个 。
若你现在已经处在应用程序文件夹中,想前往其中的一个名叫 Utilities 的子文件夹应该怎么办?
下图中,当前位置的绝对路径是 /Applications/Utilities,但由于我已经处于 /Applications 文件夹中,因此可以使用相对路径的写法 cd /Utilities,表示将当前路径转到 Utilities 文件夹。
cd /
cd /
说了这么多关于路径的写法,你可能已经头大了,懒得去这么写,那么有没有快速导入路径的方法呢?有,直接将待编辑文件或文件夹拖入终端中即可,它会自动把绝对路径提取出来,实际情况下常用的也是这种自动提取或手动复制的方法。
拖入快速提取路径
拖入快速提取路径
当你想要查看当前路径下有什么文件时,可以使用 ls 命令,它会列举当前路径下的全部文件,若你希查看进阶设定,比如列举当前路径下的全部文件并展开所有子文件夹,可以在 ls 命令后加上 -R 的识别符,新指令就变成了 ls -R,运行结果如下,可以看到我放在资源文件夹中的所有子文件都被显示出来了。
ls -R
ls -R
讲到这里,你也许会发现自己的终端已经满满当当的了,看着不舒服,这时可以使用 clear指令来清屏,运行结果如下。
clear
clear
以上讲的所有指令,都是无害指令,这里的无害指的是不会对系统文件造成破坏,但是还有一些指令,可以瞬间删掉你的整个系统,若你知道这些指令的用法那也没问题,但若是不小心根据网上的教程用了从而误删了东西就不好了。内核为了确保你知道某些指令的用法,要求你必须在这些有风险的指令前加输 sudo,这就是所谓的超级管理员指令,它会在你密码确认后,赋予 sudo 之后的命令最高权限,可以进行任何 *** 作。
比如我需要把电脑上的 Windows 分区彻底删除时,只需要输入下面这串代码,一瞬间整个磁盘分区就会被删除:
sudo diskutil eraseVolume free none diskx
关联阅读:如何彻底移除你的 Boot Camp 分区?
到这里为止,终端的非常基础教学就已经讲完了,这只是略过了终端海量指令中最常见的一小部分,毕竟终端控制的是整个系统的内核,其指令库非常之大,没有办法全部讲完。那么,当你在网上见到一个新命令的时候,怎么知道它该如何用?你可以使用 man 指令查看其用法,比如,当你见到了一个磁盘管理命令 diskutil,可以使用 man diskutil来查看这个磁盘管理命令的具体用法说明,想要退出这个说明按下键盘 Q 即可。
man
man
若你使用的是带有触控条的 Mac,可以点按触控条按钮进行快速更改终端颜色,添加书签等 *** 作。
触控栏更改颜色
触控栏更改颜色
若你想要完全自定义终端,可以在「终端 - 偏好设置 - 描述文件」中进行更改。
自定义
自定义
常见玩法
关闭崩溃报错:有时软件崩溃就已经很让人烦心了,重新打开后一遍遍d出的问题报告更是烦不胜烦。这时你可以使用 defaults write comappleCrashReporter DialogType none 命令关闭这个问题报告。若你希望恢复其显示,可以输入 defaults write comappleCrashReporter DialogType crashreport。
烦人的崩溃提醒
烦人的崩溃提醒
修改文件日期: 有时你可能需要修改文件创建或修改日期,这时可以使用 touch -t 199505090000 拖入文件命令。这句命令中的数字表示 1995 年 5 月 9 日 00:00 分,你可以根据实际需要修改。
任意修改文件日期
任意修改文件日期
不要进入休眠状态:当你临时不希望电脑进入休眠状态时,可以使用 caffeinate 命令让电脑时刻清醒。当你需要其恢复正常时,按下 ⌃Control - C 即可停止该命令。
caffeinate
caffeinate
程序假死需要强退:有时候程序假死了,强行退出也没用,这时可以使用 killall 命令。以微信为例,若想强退它,只需输入 killall WeChat 即可。
killall
killall
截图保存为 JPEG:Mac 的默认截图格式为 PNG,若你想让默认的截图保存类型为 JPEG,可以输入如下指令 defaults write comapplescreencapture type jpg,结果如下图所示,以后的截图都会变成 JPEG 格式。如果你希望撤销这条指令,输入 defaults write comapplescreencapture type png 即可。
运行命令后所有截图均为 JPEG
运行命令后所有截图均为 JPEG
关闭截图自动阴影: 若你使用 Mac 自带的截图,会发现每次的窗口截图均会自动添加阴影,当你需要后期处理这些时,这些阴影可能会对你造成困扰。你可以使用下面这串命令来关闭截图阴影:
defaults write comapplescreencapture disable-shadow -bool true; killall SystemUIServer
当你希望重新启动阴影时,可以输入:
defaults write comapplescreencapture disable-shadow -bool false; killall SystemUIServer
查看下方的截图,你就会发现它和本文的其他截图不同,没有阴影。
关闭阴影后的截图
关闭阴影后的截图
显示隐藏文件夹:在你跟着网络上的教程进行一些 *** 作时,难免会遇到让你寻找隐藏文件夹的情况,这时你可以使用:
defaults write comapplefinder AppleShowAllFiles -bool true; killall Finder
来显示所有隐藏文件夹,当你不需要再显示时,输入:
defaults write comapplefinder AppleShowAllFiles -bool false; killall Finder
即可恢复隐藏。查看下图,你会发现所有隐藏文件夹全部显示出来了。
显示隐藏文件夹
显示隐藏文件夹
整理程序栏:你也许会发现,底部的程序栏越用越乱,有时候内容多的半天找不到所需程序。这时你可以考虑为其加入几个隐藏的分界符将其归为几个区域,输入:
defaults write comappledock persistent-apps -array-add '{"tile-type"="spacer-tile";}'; killall Dock
即可添加一个空白分界符,需要几个重复运行几遍命令即可。当你不需要这个白分界符了,将它从程序栏拖走即可删除。
为程序栏加分界符
为程序栏加分界符
重置程序栏:当你想要重新整理底部程序栏时,有时候从默认状态开始整理也许是个好办法。这是你可以使用 defaults delete comappledock; killall Dock 命令将程序栏恢复为电脑刚刚激活时的状态。
恢复后的状态
恢复后的状态
打印机械感十足的文字:当你想要打出机械感十足的文字时,可以玩玩banner -w 80 legolasme这句命令,只需要将代码结尾处的文字替换为你想打印的字即可。
打印文字
打印文字
进阶教程
上面讲了不少指令,你也许会好奇,这些指令到底修改的是什么?可以修改什么?若我想改别的,应该去哪里找?
默认设置 defaults
上面这些 defaults 开始的指令,实际修改的是系统默认的 Plist 表单,这些表单管理着系统中全部程序的默认设置,上面所做的修改无非是改了某些程序的默认设置罢了。
若你想查看还有哪些可以修改,可以在访达中按下键盘 ⌥Option,点击「前往 - 资源库」,找到 Perference 文件夹,你会发现所有的 Plist 文件均在这里,你也可以根据便好手动修改。
Perference 文件夹
Perference 文件夹
文件格式转换 textutil
textutil 是一个系统自带的,用于处理文稿的命令,其中我最常用的功能是其下属功能 convert,这句指令允许你将任何文件,在以下文件格式中互相转换 txt, html, rtf, rtfd, doc, docx, wordml, odt, webarchive。
若你手头有一篇 DOCX 文件需要被转换成 TXT,则可以输入 textutil -convert txt 文件路径,这句代码中的 txt 处,可以替换为任何你需要转换到的文件格式,文件路径则可以采用拖拽文件到终端的方法自动填充。
textutil -convert
textutil -convert
磁盘处理 diskutil
磁盘处理也是常用的命令行 *** 作之一,因为其命令需要根据具体情况具体对待,所以我只简单介绍其中无风险的两个,下方列举的其余 *** 作均会直接处理磁盘内容,请务必清楚你在做什么,然后再输入命令。
若你的电脑采用的是 APFS 磁盘分区,则应使用 diskutil apfs 开头的命令;若你的电脑采用的是 HFS,HFS+ 磁盘分区,则应使用 diskutil 开头的命令;若你的电脑采用的是 coreStorage 磁盘分区,则应使用 diskutil cs开头的命令。
diskutil list 命令会将你的现有磁盘状况显示出来,如下图所示。
diskutil list
diskutil list
diskutil cs list 命令会将你的现有的 Core Storage 逻辑分区状况显示出来,如下图所示。
diskutil cs list
diskutil cs list
常用但有风险的命令 diskutil
查看分区上限:sudo diskutil resizeVolume /dev/disk1s3 limits
重置空间大小:sudo diskutil resizeVolume /dev/disk1s2 100GB
断开驱动器:sudo diskutil unmountDisk force /dev/disk1
彻底移除逻辑磁盘: diskutil unmount /Volumes/Macintosh\ HD
显示 GUID 分区结构: gpt -r show /dev/disk1
删除 EFI NO NAME:gpt remove -I 4 /dev/disk1
新增存储区块:gpt add -I 3 -b 1362424032 -s 1269536 -t 426F6F74-0000-11AA- AA11-00306543ECAC
新增分区:newfs_hfs -J -v “Recovery HD” /dev/disk0s3
物理 Core Storage 扩容: diskutil cs resizeDisk 11111111-2222-3333-4444-555555555555 980g
逻辑 Core Storage 扩容: diskutil cs resizeVolume 11111111-2222-3333-4444-555555555555 980g
自动安装 brew
Mac 有个很方便的包管理器,名叫 Homebrew,它允许你自动安装许多应用程序。Homebrew 不是 terminal 的自带内容,需要运行这串命令来进行安装:
/usr/bin/ruby -e "$(curl -fsSL >
如果你想推流一个文件夹里的所有视频,你可以使用通配符(wildcard)来匹配文件夹中的所有视频。例如,你可以使用 -i /path/to/folder/mp4 来匹配文件夹中所有的 MP4 视频文件。
如果你想推流多个视频,你可以使用 -i 参数多次指定视频文件的路径。例如,你可以使用 ffmpeg -re -i video1mp4 -i video2mp4 -vcodec libx264 -acodec aac -f flv rtmp://localhost:1935/rtmplive/home 来推流 video1mp4 和 video2mp4 这两个视频。
你也可以使用 -f concat 参数来将多个视频文件合并成一个输入源,然后使用 -i 参数指定合并后的视频文件。这样,你就可以使用单个命令推流多个视频。例如:
ffmpeg -f concat -safe 0 -i listtxt -c copy outputmp4
ffmpeg -re -i outputmp4 -vcodec libx264 -acodec aac -f flv rtmp://localhost:1935/rtmplive/home
其中,listtxt 是一个文本文件,其中包含了要合并的视频文件的列表。每一行的格式为 file '/path/to/videomp4'。例如:
file '/path/to/video1mp4'
file '/path/to/video2mp4'
file '/path/to/video3mp4'
这样,你就可以使用两条命令推流多个视频了。
看看这个,我昨天刚写的: import javaioBufferedOutputStream;
import javaioFile;
import javaioFileNotFoundException;
import javaioFileOutputStream;
import javaioFileReader;
import javaioIOException;
import javaioPrintWriter;
import javautilScanner;public class AddList {
private String filePath = "";
private String bakPath = "";
private String content = "";
Scanner sc = new Scanner(Systemin);
public String readFile(){
content = "";
if (isNull(filePath)) {
Systemoutprintln("文件存储路径:");
filePath = scnextLine();
}
File file = new File(filePath);
FileReader fr = null;
try {
if (fileexists()) {
fr = new FileReader(file);
char[] chars = new char[1024];
int n = 0;
while((n = frread(chars)) != -1){
String string = new String(chars, 0, n);
content = content + string;
}
} else {
Systemoutprintln("文件不存在");
}
} catch (Exception e) {
eprintStackTrace();
} finally {
if (fr != null) {
try {
frclose();
} catch (IOException e) {
eprintStackTrace();
}
}
}
return content;
}
public void writeFile(String path){
File file = new File(path);
FileOutputStream fos = null;
mkDirs(path);
try {
fos = new FileOutputStream(file);
BufferedOutputStream bos = new BufferedOutputStream(fos);
PrintWriter pw = new PrintWriter(bos, true);
pwprint(content);
pwflush();
} catch (FileNotFoundException e) {
eprintStackTrace();
} finally {
if (fos != null) {
try {
fosclose();
} catch (IOException e) {
eprintStackTrace();
}
}
}
}
public void writeFile(){
if (isNull(filePath)) {
Systemoutprintln("文件存储路径:");
filePath = scnextLine();
}
File file = new File(filePath);
FileOutputStream fos = null;
mkDirs(filePath);
try {
fos = new FileOutputStream(file);
BufferedOutputStream bos = new BufferedOutputStream(fos);
PrintWriter pw = new PrintWriter(bos, true);
pwprint(content);
pwflush();
} catch (FileNotFoundException e) {
eprintStackTrace();
} finally {
if (fos != null) {
try {
fosclose();
} catch (IOException e) {
eprintStackTrace();
}
}
}
}
public void mkDirs(String filepath){
if (filepathindexOf("\\") != -1) {
filepath = filepathreplaceAll("\\", "/");
}
int n = filepathindexOf("//");
String path = filepathsubstring(0, n) + "//";
filepath = filepathsubstring(filepathindexOf("//") + 1, filepathlength());
String[] files = filepathsplit("/");
for (int i = 0; i < fileslength - 1; i++) {
path = path + files[i];
File file = new File(path);
if (!fileexists()) {
filemkdir();
}
}
}
public void addImfor(){
Systemoutprintln("--------增加记录---------");
String name = "";
String tel = "";
String email = "";
content = readFile();
while(true){
Systemoutprintln("姓名:");
name = scnext();
Systemoutprintln("电话:");
tel = scnext();
Systemoutprintln("Email:");
email = scnext();
content = content + name + "<>" + tel + "<>" + email +"<==>";
Systemoutprintln("0、Exit 1、继续");
int i = scnextInt();
if (i == 0) {
break;
}
}
writeFile();
}
public void deleteImfor(){
Systemoutprintln("---------删除记录---------");
String name = "";
String[] imfors = null;
content = readFile();
while(true){
Systemoutprintln("你要删除的姓名是:");
name = scnext();
if (contentindexOf(name) != -1) {
imfors = contentsplit("<==>");
for (int i = 0; i < imforslength; i++) {
if (imfors[i]indexOf(name) != -1) {
imfors[i] = "";
}
}
content = "";
for (int i = 0; i < imforslength; i++) {
if (!isNull(imfors[i])) {
content = content + imfors[i] + "<==>";
}
}
writeFile();
Systemoutprintln("删除成功");
} else {
Systemoutprintln("此人不存在");
}
Systemoutprintln("0、Exit 1、继续");
int i = scnextInt();
if (i == 0) {
break;
}
}
}
public void viewAll(){
Systemoutprintln("----------显示所有------------");
content = readFile();
if (!isNull(content)) {
String[] imfors = contentsplit("<==>");
Systemoutprintln("姓名\t电话\tEmail");
for (int i = 0; i < imforslength; i++) {
String[] imfor = imfors[i]split("<>");
for (int j = 0; j < imforlength; j++) {
Systemoutprint(imfor[j] + "\t");
}
Systemoutprintln();
}
} else {
Systemoutprintln("暂时还没有记录");
}
}
public void queryImfor(){
Systemoutprintln("----------查找记录-----------");
content = readFile();
if (!isNull(content)) {
String result = "";
String[] imfors = null;
String[] imfor = null;
String name = "";
boolean bool = false;
while(true){
result = "";
Systemoutprintln("请输入关键字(按姓名查找):");
name = scnext();
bool = false;
if (contentindexOf(name) != -1) {
imfors = contentsplit("<==>");
for (int i = 0; i < imforslength; i++) {
if (imfors[i]indexOf(name) != -1) {
imfor = imfors[i]split("<>");
if (imfor[0]equals(name)) {
bool = true;
result = result + imfors[i] + "<==>";
}
}
}
if (bool) {
imfors = resultsplit("<==>");
Systemoutprintln("姓名\t电话\tEmail");
for (int i = 0; i < imforslength; i++) {
imfor = imfors[i]split("<>");
for (int j = 0; j < imforlength; j++) {
Systemoutprint(imfor[j] + "\t");
}
Systemoutprintln();
}
} else {
Systemoutprintln("无此人信息");
}
} else {
Systemoutprintln("无此人信息");
}
Systemoutprintln("0、Exit 1、继续");
int i = scnextInt();
if (i == 0) {
break;
}
}
} else {
Systemoutprintln("文件还没有记录");
}
}
public void copy(){
Systemoutprintln("----------备份-----------");
content = readFile();
if (isNull(bakPath)) {
Systemoutprintln("备份全路径:");
bakPath = scnext();
}
writeFile(bakPath);
Systemoutprintln("备份成功");
}
public boolean isNull(String string){
if (null == string || "" == string || 0 == stringlength()) {
return true;
} else {
return false;
}
}
public static void main(String[] args) {
AddList add = new AddList();
Scanner sc = new Scanner(Systemin);
int operater = 0;
while(true){
Systemoutprintln("选择功能:\n1、增加记录 2、删除记录 3、显示所有 4、查询记录 5、备份 6、退出");
operater = scnextInt();
if (1 == operater) {
addaddImfor();
} else if (2 == operater) {
adddeleteImfor();
} else if (3 == operater) {
addviewAll();
} else if (4 == operater) {
addqueryImfor();
} else if (5 == operater) {
addcopy();
} else if (6 == operater) {
Systemoutprintln("谢谢使用");
break;
}
}
}
}
查看q7的时间文件位置方法如下:
1、按CAR按钮,打开MMI系统,按STEPU按钮,在按旋转按钮右上方的按钮,左右旋转即可调整时间,调整好后按下保存。
2、双击脚本,会d出如下对话框,点击在终端中运行,d出:将q7文件拖拽到终端窗口后放开,这样终端窗口就会获取到文件完整的路径和名称。
模式:
当打开终端,第一行所见的就叫命令行提示符。我的是这样的:
命令行提示符,顾名思义就是提示在其后面输入命令。在你输入新的一行命令前,这个命令提示符都会出现。分别解析一下上边代表什么意思:
oscar 这是当前用户的名字。Linux是一个多用户的 *** 作系统,Windows也可以。不过Linux的多用户管理更方便。我们一般建议每个使用Linux系统的用户都创建一个属于自己的账户,便于隐私管理。
@ 这个符号我们应该不陌生,我们的电子邮件一般都是 name@domaincom 这样的不是吗。这个@就表示英语里的at,是“在里面,落户在的,在其中”的意思。@前面是用户名,后面是所在的域。
oscar-laptop 这是当前电脑/ *** 作系统的名字。上面说了在@后面的是一个域,所以 oscar@oscar-laptop 就表示oscar-laptop这台电脑的oscar这个用户。oscar-laptop这个名称在安装此Linux系统时可以任意指定。
: 这是分隔符,没有什么特别的涵义。
~ 这是当前所在目录的名字,会随着用户进入不同目录而改变。~表示当前用户的家目录,有点类似Windows系统的“我的文档”这个目录。
$ 指示你所具有的权限的字符。在Linux系统中有两种可能:
因此, oscar@oscar-laptop:~$ 的意思就是:
你目前是以oscar这个用户登录;你的电脑名称为oscar-laptop;你目前位于 ~ 目录下,就是你的用户家目录。你是普通用户,拥有有限的权限。
参数里可以包含多个参数,由空格隔开,也可以包含数字,字母,等等。可以说,参数没有固定的格式,但是一般来说还是遵循一定的规范的。
如果我们要一次加好几个短参数,可以用空格隔开,例如:
多个短参数也可以合并在一起,例如上面的命令等价于:
请注意:参数的字母的大小写是有区别的,大写的T和小写的t通常表示不同意思。
如果有多个长参数,是不能像多个短参数那样合并写的。而是只能以空格隔开,例如:
当然我们也可以组合使用短参数和长参数,例如:
有时候,同一个意义的参数有短参数和长参数两种形式,效果是一样的,可以任选哪一种。
有一些参数你还需要给它赋一个值才行。而且短参数和长参数的赋值的方式不尽相同。
例如,短参数赋值,通常是这样的:
表示把10赋值给p参数。
如果是长参数,则一般是这样赋值:
长参数的方式更加容易理解,但是不如短参数那么简洁。
正如我们说过的,参数的形式没有绝对的准则。我们上面给出的规则是一般的,有些命令的参数格式可能是我们没怎么见过的。
有些参数就不一样,而且取决于命令。例如对于 ls 这个命令,假如后面带了一个参数,这个参数是一个目录的路径名的话,那么就会列出此目录下的文件。
两种类型的文件
简单起见,我们把Linux下的文件分为两大类:
在一个文件系统中,我们总有一个被称为根目录的东西,这个根目录里包含了所有其他目录和文件。Linux中有且只有一个根目录,就是
是的,就是用一个斜杠表示。没有比根目录再高一阶的目录了,因为没有目录包含根目录,根目录就是Linux最顶层的目录。
Linux系统安装后,包含了很多的文件和目录(虽然其实都是文件),我们很容易迷失在“茫茫文海”中。
当然我们不可能一下子列出Linux中的所有文件,那不现实。但是我们可以向你展示如何在Linux的目录树中来回穿梭,你可以知道此刻你位于哪个目录下。就好比能看懂Linux这个很大的“地图”。
pwd 是英语Print Working Directory的缩写,表示“打印当前工作目录”。
which 命令:获取命令的可执行文件的位置,which命令用于显示一个命令的对应的可执行程序的位置。可能听起来有点拗口。
在Linux下,每一条命令其实对应了一个可执行程序。我们在终端中输入命令,再按回车的时候,其实就是执行了对应的那个程序。比如说,pwd命令对应的pwd程序就是存在于Linux中的。
which命令接受一个参数,也就是你想要知道其可执行程序位于哪里的那个命令。
我们来测试一下,就拿pwd命令来测试好了:
得到:
因此,pwd命令对应的pwd这个可执行程序位于/bin目录中。
我们也可以注意到Linux中的可执行程序和Windows中不太一样,在Windows中可执行程序一般以exe结尾,而Linux中一般是没有后缀名的。
Linux中的可执行程序也不是都位于相同目录的。我们可以来测试一下which命令本身对应的可执行程序位于哪里:
我们可以看到,which命令对应的可执行程序which并不位于/bin中,而是在/usr/bin中。
Ubuntu的终端默认是有颜色标注的,一般来说:
如果在你的终端里没有标明颜色,那么你可以加上参数 --color=auto 来开启颜色标注。如下:
如果你不需要颜色标注,那么可以用 --color=none 来关闭颜色标注。如下:
当然,为了避免每次都输入这么一串额外的参数,其实我们可以在一个配置文件里修改,使得永久显示颜色或不显示颜色。
在Linux,以点( )开头的文件是隐藏文件,不过这里不包括开头的两个 和 ,这两个的含义如下:
- (一个点)表示当前目录。在当前情况下,就是 /home/oscar 。
- (两个点)表示上一级目录。因为当前目录是/home/oscar,所以上一级目录就是 /home 。
我们有一个大写的参数 -A,它的作用和小写的-a几乎一样,唯一不同就是-A不列出 和 这两个文件。
-l 这个参数算是ls命令最常用的了。加上-l参数使得ls命令列出一个显示文件和目录的详细信息的列表。
当我们仅用ls -l时,列出的文件详细信息中,文件的大小是以字节为单位的。有时这不是太直观。我们可以再加一个参数-h,h是humain readable的缩写,表示“适合人类阅读的”。所以我们的命令变成了:
t是time的缩写。
du命令也是很有用的,因为它可以让我们知道文件和目录所占的空间大小。
虽然ls -l命令也可以显示文件和目录的大小,但是du命令统计的才是真正的文件大小。du命令会深入遍历每个目录的子目录,把所有文件的大小都做一个统计。
du是英语disk usage的缩写,表示“磁盘使用/占用”。
我们的du命令也可以使用参数。
cat命令和less命令:显示文件内容,这两个命令只能显示文件内容,并不能对文件内容进行修改。
一次性显示文件的所有内容,如果你想要在显示的文件内容上加上行号,那么你可以加上 -n 这个参数。
分页显示文件内容
head命令和tail命令:显示文件的开头和结尾。
显示文件开头,默认情况下,head会显示文件的头10行。我们也可以指定显示的行数,用 -n 这个参数:
就会显示文件的头5行。
显示文件结尾。默认情况下,tail会显示文件的尾10行。
我们也可以指定显示的行数,用 -n 这个参数:
就会显示文件的尾5行。
tail命令还可以配合 -f 参数来实时追踪文件的更新:
这样,就会检查文件是否有追加内容,如果有,就显示新增内容。
默认地,tail -f会每过1秒检查一下文件是否有新内容。你也可以指定间隔检查的秒数,用 -s 参数:
可以用快捷键 Ctrl + c 来终止tail -f 命令。
touch命令和mkdir命令:创建文件和目录
创建一个空白文件。事实上,Linux没有一个命令是专门用来创建一个空白文件的。touch命令其实一开始的设计初衷是修改文件的时间戳,就是可以修改文件的创建时间或修改时间,让电脑以为文件是在那个时候被修改或创建的。但是touch命令如果后面跟着的文件名是不存在的,那么它就会新建一个。
事实上,我们可以用touch命令同时创建多个文件:
如果我所要创建的文件的名字里有空格怎么办呢?
很简单,加上双引号:
创建一个目录。
mkdir也可以同时创建好几个目录:
如果我所要创建的目录的名字里有空格怎么办呢?
很简单,加上双引号:
我们还可以用 -p 参数来递归创建目录结构。
比如:
cp命令和mv命令:拷贝文件和移动文件
拷贝文件或目录
cp是英语copy的缩写,表示“拷贝”。所以,顾名思义,此命令用于拷贝。cp命令不仅可以拷贝单个文件,还可以拷贝多个文件,也可以拷贝目录。
复制文件到另一个目录只需要把cp命令的第二个参数换成目录名。
拷贝目录
要拷贝目录,只要在cp命令之后加上-R参数(注意是大写的R)。拷贝的时候,目录中的所有内容(子目录和文件)都会被拷贝。
使用通配符
号(星号)是很常用的正则表达式的符号,被称为“通配符”,
所以如果我们用如下命令:
那么就会把当前目录下所有txt文件拷贝到folder这个子目录当中。
又如:
那么就会把当前目录下凡是以ha开头的文件都拷贝到folder目录中。
移动文件
mv是英语move的缩写,表示“移动”。mv命令有两个功能:
用mv命令来移动目录很简单,不需要额外的参数,就跟移动文件一样:
当然,我们也可以使用通配符。
除了移动文件,mv命令还可以用于重命名文件。
事实上,Linux中没有一个专门的命令用于重命名文件。之所以mv命令可以重命名文件,其实还是归因于它的机制:移动文件。经过mv移动之后,原始文件变成了新的名字的文件,文件内容是不变的,这不就相当于重命名了吗?
以上命令会将new_file重命名为renamed_file。
删除文件和目录
rm命令可以删除一个文件,多个文件,目录,甚至你的整个Linux系统(如果你愿意的话)。
以上命令删除当前目录下的new_file_copy这个文件。
我们也可以同时删除多个文件,只要用空格隔开每个文件即可。例如:
保险起见,用rm命令删除文件时,可以加上 -i 参数,这样对于每一个要删除的文件,终端都会询问我们是否确定删除。i是英语inform的缩写,表示“告知,通知”。
有两种回答:
y:是英语yes的缩写,表示“是”。那么回车确认后,文件就删除了。
n:是英语no的缩写,表示“否”。那么回车确认后,文件不会删除。
如果在rm命令后加上-f参数,那么终端不会询问用户是否确定删除文件,不论如何,文件会立刻被强制删除。
f是英语force的缩写。
以上命令会强制删除file文件。
r是英语recursive的缩写,表示“递归的”。所以使用-r参数,可以使rm命令删除目录,并且递归删除其包含的子目录和文件。
这个命令也挺危险的,用得不好可能你的子目录和文件都没了。
以上命令会删除one这个目录,包括其子目录和文件。
其实,也存在一个命令
看着和 rm -r 挺像的。但是这个命令有个局限性:只能删除空的目录。
创建链接
事实上,Linux下有两种链接类型:
为了区分这两种链接类型的不同,我们首先来谈一谈如Linux这样的 *** 作系统中文件在硬盘上的存放。
文件在硬盘上存储时,大致来说(请注意我用了“大致来说”),每个文件有两部分:
文件名的列表是储存在硬盘的其他地方的,和文件内容分开存放,这样方便Linux管理。
注意:为什么我上面要用“大致说来”呢?因为此处我们简化了描述,其实每个文件有三部分:
我们这里简化地将文件分为两部分:文件名和文件内容。因为我们不想把事情复杂化,我们想要理解两种链接类型的区别,暂时只要知道这些就够了。
每个文件的文件内容被分配到一个标示号码,就是inode。因此每个文件名都绑定到它的文件内容(用inode标识)。原理如下图:
下面我们学习如何创建硬链接和软连接。
比之软链接,硬链接的使用几率小很多。但是我们还是要学习一下,毕竟可能会用到。
硬链接的原理:使链接的两个文件共享同样的文件内容,也就是同样的inode。
所以一旦文件1和文件2之间有了硬链接,那么你修改文件1或文件2,其实修改的是相同的一块内容。只不过我们可以用两个文件名来取到文件内容。
硬链接有一个缺陷:只能创建指向文件的硬链接,不能创建指向目录的硬链接。但是软链接可以指向文件或目录。当然了,事实上,通过一些参数的修改,也可以创建指向目录的硬链接,但是比较复杂,这里不再详述。所以对于目录的链接,我们一般都是用软链接。
硬链接原理图:
要创建硬链接,直接用ln命令,不加任何参数:
我们可以用ls -i命令查看一下(-i参数可以显示文件的inode)。对于硬链接来说,删除任意一方的文件,共同指向的文件内容并不会从硬盘上被删除。
我们用ls -l命令查看文件信息的时候,第二列的那个2,其实是表示拥有相同inode号的文件数。不难理解,因为它们指向相同的文件内容,所以共享一个inode。
这个第二列的数字,一般来说对于普通文件,都是1,因为不同文件inode不同嘛。对于目录来说,这第二列的数字标明目录内所含文件数目。
其实,软链接才是真正像我们在Windows下的快捷方式的,其原理很相似。
创建硬链接是ln不带任何参数,但是要创建软链接需要加上-s参数。s是symbolic(符号的)的缩写。
file2指向的不再是file1的文件内容(和硬链接不同),而是指向file1的文件名。
软链接原理图:
用ls -l命令查看一下,会发现形式和之前的硬链接不一样噢,file2的信息是这样的: file2->file1,表示file2指向file1。
而且file2前面的权限那里的第一个字母变成了l,表示link(链接)。之前硬链接的时候是没有l的,硬链接外表看起来就和普通文件类似。
我们用ls -l命令查看文件信息的时候,第二列的那个1,表示拥有相同inode号的文件数。不难理解,因为file2指向file1,它们并没有指向同一块文件内容,所以它们的inode号不相同。
软链接的特点:
从入行至今,使用Terminal的次数并不多,现用现查是常态,平时开发中 Git 也是使用图形界面工具,所以对Terminal非常陌生,直到最近自己搭了一个***才真正意识到命令行的便捷,而搭建博客的过程中命令行更是不可缺少的工具。
Mac上很多功能不提供图形界面,只能通过命令行来实现,例如说 ssh ,Windows下需要使用 XShell 之类的软件来 *** 作,而nix系统直接使用终端命令就可以直接链接:
通过Terminal可以访问所有目录,包括 Finder 隐藏的目录,而 Finder 的隐藏文件功能也只能通过 Terminal 开关,当然在系统 1012 中可以使用 Shift + Command + 来快速开启与关闭:
Terminal可以做界面图形App能做的绝大多数 *** 作,因为界面图形App背后使用的就是Command Line,例如在你安装 Xcode 之后,你就可以通过命令行进行编译和打包 *** 作:
虽然学习Command Line需要一个记忆和熟练的过程,但其强大且广泛的功能带给我们的便利快捷要远大于其学习成本,所以说使用Terminal,学会Command Line是一个程序员必备的素质之一。
Terminal里面成百上千条命令,每一条命令还有其具体的参数方法,谁也不能全都记住,那么怎么办?推荐学习Command Line的人们最先掌握的命令 man 。通过 man CommandName 来获取你想知道的命令的使用指南:
包括命令的名称、参数意义、使用描述等等,足够你理解使用这个命令了,在浏览期间可以通过 Space 翻页、 ↑ 和 ↓ 来滚动、输入 / SearchKeyword 来搜索,使用 Q 退出页面。如果你不清楚这个命令的名字,可以使用 man -K Keyword 来搜索,Terminal会询问你搜索的结果是否是你想要的。
虽然平时使用Finder管理文件已经很方便了,但是某些时候使用Terminal来进行路径和文件的 *** 作也会非常便捷。
路径分为绝对路径和相对路径。
绝对路径总是以 / 开头,例如 /Users/xuhaoran/blog 。
相对路径是根据你的Terminal当前的路径位置有关,Terminal默认路径为 Home Folder ,就是 ⌘ + ⇧ + H 的Folder,相对路径可以使用 / 来表示上一级路径,使用 / 表示本级路径,通常可以省略,使用 ~/ 则表示你的 Home Folder 。
绝对路径的第一个 / 代表根目录,而 /Users/UserName 即是 HomeFolder 。
如何获取绝对路径?有两个方法:1、打开Terminal后,直接拖拽Folder或File进来;2、使用 pwd 命令:
跳转到指定路径使用 cd 命令:
cd - 命令可以后退目录:
查看当前路径下的所有Folder和File使用 ls 命令,值得一提的是使用 Tab 可以进行匹配输入,注意Terminal大小写敏感。通常情况 ls 命令是不显示隐藏文件的,可以使用 ls -A 来显示所有隐藏文件,即 Name 形式的文件:
pwd 、 cd 、 ls 三条命令搭配使用可以完成绝大多数的路径查询跳转工作,至于这三个命令的其他参数可以使用 man 来自行查询。
而创建与删除路径使用 mkdir 与 rmdir 两个命令:
使用 mkdir 命令时,如果想创建多层目录的话可以添加参数 p :
通过Command Line检视文件,可以使用命令 cat 将文件内容输出到Terminal中:
面对较长的文本直接输出到Terminal中显然并不合理,那么可以使用 less 命令,在 less 命令进入文件后按 V 进入vim编辑器。
如果想查看文件类型信息,特别是在文件扩展名丢失的情况下,可以使用 file 命令:
可以使用 touch 命令创建文件和指定文件扩展名:
创建之后可以直接进入编辑器进行编辑,可以使用 vim 命令进去vim编辑器或者 nano 命令进入nano编辑器:
可以使用 open 命令打开一个文件或者使用Finder打开一个Folder,使用 open 命令来打开当前的Folder:
对于基本的复制剪切 *** 作可以分别使用 cp 、 mv 命令:
查看当前目录下的文件权限可以使用 ls -alh 命令:
其中权限部分详细的分为 d rwx rwx rwx 四部分。
第一部分中 d 表示为Directory,而 - 则表示File。
后面三部分分别表示“对所有者”、“对同组人”、“对其他人”的权限, r 读取权限、 w 写入权限、 x 执行权限, - 表示无权限。
以其中 AlamofireDemo 为例,表示为目录、所有者可读可写可执行、同组人可读可执行、其他人可读可执行。
而三部分的权限可使用数字表示,其中 r 权限为2², w 权限为2¹, x 权限为2º,例如: AlamofireDemo 目录的全校可以表示为 755 ,而 cerSigningRequest 文件的权限为 644 。
权限是可以变更的,使用 chmod 命令:
这是通常情况下的标准命令,为文件添加 rwxr-xr-x 权限, -R 参数表示改变目录结构下所有子目录文件的权限而并非目录本身。 chmod 777 FileName 则是非常危险的命令,赋予了其他人与root相同的权限。
chmod 还有一种改变权限的形式,使用运算符 + (增加)、 - (去除)、 = (覆盖设定)配合用户类型 u (所有者)、 g (同组人)、 o (其他人)、 a (全部):
上面这条命令是为 AlamofireDemo 这个目录的同组人添加执行权限。
同样,拥有者和群组也是可以改变的,使用 chown 命令:
sudo 命令的作用在于会用root账户权限来执行后面的命令,通常在执行一条命令提示 Permission denied 时使用。使用 sudo !! 再次执行:
如果执行多条需要root权限的命令,可以使用 sudo -s 获取root权限,注意 # 代替了 $ 表示使用root权限 *** 作, *** 作结束可以使用 Control + D 或者输入 exit 命令来退出环境:
在网络通信之前,最常用的 *** 作就是 ping 命令,它会给网络主机发送一个回应请求,进而验证可否进行通信:
可使用 Control + C 停止发送请求。
ssh 是一种远程登录和其他安全服务的协议,远程登录相比较于 telnet 和 rlogin 两种协议,有其特有的优势,例如加密传输、数据压缩等。
Mac的Terminal自带SSH,使用 ssh 就可以登录远程服务器:
之后就可以在远程服务器进行一些常规 *** 作或者一些逗逼的命令:
网络通信命令还有很多,这里限于能力就不献丑了。
bash 命令是用来执行一段脚本命令的命令,通常可以用来执行本地写好的脚本,例如:
who 命令可以列出当前登录的所有用户, who am i 显而易见是回答“我是谁?”的问题:
console 是电脑的底层控制台,伴随着电脑开机而启动; ttys (Teletypewriter的缩写)则是Terminal的类型名称,随着Terminal数量增加而增加计数。使用 Command + N 来新建Terminal。
至于 Console 、 Terminal 、 tty 和 Shell 的关系这里就不叙述了。
使用 ps 命令来查看进程状态,可以确定哪些进程僵死或过多占用资源等。通常使用 ps aux 来查看具体进程:
PID 表示进程的id, %CPU 、 %MEM 分别表示进程占用CPU和内存的比重, VSZ 表示使用掉的虚拟内存(KB), RSS 表示占用的固定内存(KB), TT 表示在哪个Terminal上执行, STAT 表示该进程目前的状态。
关于 STAT 的状态码:
查询到进程之后可以使用 kill 命令用来终止进程:
至于 SignalNumber 可以通过命令 kill l 获取:
其中常用的为9(SIGKILL),对付大多数程序可以 kill -9 PID 直接干掉。
其他常用的系统命令有查看时间的命令 date :
查看日历的命令 cal :
cal 命令后面可接年份,例如 cal 2017 ,也可以接月份+年份,例如 cal 8 2018 表示展现2018年8月的日历。
对于常用的命令可以使用 alias 为其添加别名,例如:
删除别名可以使用 unalias :
使用 control + C 可以终止持续进行的命令,例如 ping 命令。
使用 control + D 或者 exit 命令可以结束当前状态,例如结束 ssh 的远程链接。
使用 control + L 或者 clear 命令可以清屏,与 reset 命令不同的是, clear 可以滚动查看之前的内容,而 reset 则是完全清除内容。
使用 history 命令可以查询执行命令的历史记录 history PageCnt :
连续写了两天时间,期间不断的去查询和完善内容,感觉这个过程又收获了很多知识。
Terminal的强大只有真正融入进去才能感受得到,以上这些都只是本人在工作中遇到的最基本的内容,说成冰山一角毫不为过,所以日后遇到新的内容还会继续进行补充更新。
最后,很多命令下的参数都有不同的用法,当遇到问题了请熟练地使用 man 命令,希望对您有所帮助。
以上就是关于mac终端只显示目录全部的内容,包括:mac终端只显示目录、terminal终端怎么调到下面、关于ffmpeg推流,如何推流一个文件夹里的所有视频或者多个视频等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)