`

Linux的文件及目录操作命令

阅读更多
目录操作命令:
cd(Change Directory)∶变换目录
cd ~username,进入某个用户的家目录
cd ~,回到当前用户的家目录
cd,不加任何参数,也是回到当前用户的家目录

pwd(Print Working Directory)∶显示目前的目录

mkdir(make directory) ∶建立一个新的目录
但请注意,默认情况下,你所需要的目录得一层一层的建立才行。
但可以使用-p参数,如mkdir -p hello/hello1,在当前目录下建立两级目录hello/hello1

rmdir∶删除一个空的目录
目录需要一层一层的删除才行!而且 被删除的目录里面必定不能还有其他的目录或档案!
也可以使用-p参数来删除父目录和子目录两级。如rmdir -p hello/hello1。
也可以使用rm -r来删除目录中的所有东西,但是要小心!

关于执行档路径的变数∶ $PATH
『 为什么我可以在任何地方执行 /bin/ls 这个指令呢? 』对呀! 为什么我可以直接执行 ls 就一定可

以显示出一些讯息而不会说找不到该 /bin/ls 指令呢? 这是因为环境变数 PATH 的帮助所致呀!
当我们在执行一个指令的时候, 系统会依照 PATH 的设定去每个 PATH 定义的路径下搜寻执行档,先搜寻

到的指令先被执行之!现在,请下达 echo $PATH , 可以显示设置的环境变量。注意shell区分大小写。
执行结果:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games(当然根据自

己的设置不同而不同),注意每个目录中间以:(冒号)分割。而在windows下,是以;(分号)分隔不同目

录的。  当然也可以带上绝对路径来下达命令。

ls ∶ 档案与目录的检视
参数∶
-a  ∶全部的档案,连同隐藏档( 开头为 . 的档案) 一起列出来~
-A  ∶全部的档案,连同隐藏档,但不包括 . 与 .. 这两个目录,一起列出来~
-d  ∶仅列出目录本身,而不是列出目录内的档案资料
-f  ∶直接列出结果,而不进行排序 (ls 预设会以档名排序!)
-F  ∶根据档案、目录等资讯,给予附加资料结构,例如∶
      *∶代表可执行档; /∶代表目录; =∶代表 socket 档案; |∶代表 FIFO 档案;
-h  ∶将档案容量以人类较易读的方式(例如 GB, KB 等等)列出来;
-i  ∶列出 inode 位置,而非列出档案属性;
-l  ∶长资料串列出,包含档案的属性等等资料;
-n  ∶列出 UID 与 GID 而非使用者与群组的名称 (UID与GID会在帐号管理提到!)
-r  ∶将排序结果反向输出,例如∶原本档名由小到大,反向则为由大到小;
-R  ∶连同子目录内容一起列出来;
-S  ∶以档案容量大小排序!
-t  ∶依时间排序
举例来说, 您下达 ls /etc 之后,只有经过排序的档名以及以蓝色显示目录及白色显示一般档案,如此

而已。

cp, rm, mv 复制、移动与删除
cp命令:
-a  ∶相当于 -pdr 的意思;
-d  ∶若来源档为连结档的属性(link file),则复制连结档属性而非档案本身;
-f  ∶为强制 (force) 的意思,若有重复或其他疑问时,不会询问使用者,而强制复制;
-i  ∶若目的档(destination)已经存在时,在覆盖时会先询问是否真的动作!
-l  ∶进行硬式连结 (hard link) 的连结档建立,而非复制档案本身;
-p  ∶连同档案的属性一起复制过去,而非使用预设属性;
-r  ∶递回持续复制,用于目录的复制行为;
-s  ∶复制成为符号连结档 (symbolic link),亦即『捷径』档案;
-u  ∶若 destination 比 source 旧才更新 destination !
在预设的条件中, cp 的来源档与目的档的权限是不同的,目的档的拥有者通常会是指令操作者本身。

rm移除文档或目录
移除的指令( remove ),相当于 dos 下的 del 指令!
参数∶
-f  ∶就是 force 的意思,强制移除;
-i  ∶互动模式,在删除前会询问使用者是否动作
-r  ∶递回删除啊!最常用在目录的删除了

mv (移动档案与目录,或更名)
参数∶
-f  ∶force 强制的意思,强制直接移动而不询问;
-i  ∶若目标档案 (destination) 已经存在时,就会询问是否覆盖!
-u  ∶若目标档案已经存在,且 source 比较新,才会更新 (update)


取得路径的档案名称与目录名称
例如:
basename /etc/sysconfig/network
network  <== 很简单!就取得最后的档名~
dirname /etc/sysconfig/network
/etc/sysconfig  <== 取得的变成目录名了!

显示文件内容:
cat  由第一行开始显示档案内容
参数∶
-A  ∶相当于 -vET 的整合参数,可列出一些特殊字符~
-E  ∶将结尾的断行字元 $ 显示出来;
-n  ∶列印出行号;
-T  ∶将 [tab] 按键以 ^I 显示出来;
-v  ∶列出一些看不出来的特殊字符

tac  从最后一行开始显示,可以看出 tac 是 cat 的倒著写!

nl   显示的时候,顺道输出行号!

more 一页一页的显示档案内容
在 more 这个程式的运作过程中,你有几个按键可以按的∶
空白键 (space)∶代表向下翻一页;
Enter         ∶代表向下翻『一行』;
/字串         ∶代表在这个显示的内容当中,向下搜寻『字串』;
:f            ∶立刻显示出档名以及目前显示的行数;
q             ∶代表立刻离开 more ,不再显示该档案内容。

less 与 more 类似,但是比 more 更好的是,他可以往前翻页!
less 的用法比起 more 又更加的有弹性,怎么说呢?在 more 的时候,我们并没有办法向前面翻, 只能

往后面看,但若使用了 less 时,呵呵!就可以使用 [pageup] [pagedown] 等按键的功能来往前往后翻看

文件
空白键    ∶向下翻动一页;
[pagedown]∶向下翻动一页;
[pageup]  ∶向上翻动一页;
/字串     ∶向下搜寻『字串』的功能;
?字串     ∶向上搜寻『字串』的功能;
n         ∶重复前一个搜寻 (与 / 或 ? 有关!)
N         ∶反向的重复前一个搜寻 (与 / 或 ? 有关!)
q         ∶离开 less 这个程式;


head 只看头几行
参数∶
-n  ∶后面接数字,代表显示几行的意思
不加参数默认显示前10行。

tail 只看尾巴几行
参数∶
-n  ∶后面接数字,代表显示几行的意思
默认是显示后10行。
例题一∶假如我想要显示 ~/.bashrc 的第 11 到第 20 行呢?
那么我取前 20 行,再取后十行,所以结果就是∶『 head -n 20 ~/.bashrc | tail -n 10 』这里用到了

管道。

我们上面提到的,都是在查阅纯文字档 (ASCII 格式的档案) 的内容。万一我们想要查阅非文字档,举例

来说,例如 /usr/bin/passwd 这个执行档的内容时, 又该如何去读出资讯呢?如果仍然用上面的指令的

话,由于执行文件是二进制文件,就会显示出乱码!!可以用下面的od命令来读取。

od   以二进位的方式读取档案内容!非纯文字档,即读取不全是ASCII码的文件。
参数∶
-t  ∶后面可以接各种『类型 (TYPE)』的输出,例如∶
      a       ∶利用预设的字元来输出;
      c       ∶使用 ASCII 字元来输出
      d[size] ∶利用十进位(decimal)来输出资料,每个整数占用 size bytes ;
      f[size] ∶利用浮点数值(floating)来输出资料,每个数占用 size bytes ;
      o[size] ∶利用八进位(octal)来输出资料,每个整数占用 size bytes ;
      x[size] ∶利用十六进位(hexadecimal)来输出资料,每个整数占用 size bytes ;

修改档案时间与建置新档∶ touch
每个档案在 linux 底下都会记录三个主要的变动时间
modification time (mtime)∶当该档案的『内容资料』变更时,就会更新这个时间! 内容资料指的是档

案的内容,而不是档案的属性喔!
status time (ctime)∶当该档案的『状态 (status)』改变时,就会更新这个时间,举例来说, 像是权限

与属性被更改了,都会更新这个时间啊~
access time (atime)∶当『该档案的内容被取用』时,就会更新这个读取时间 (access)。 举例来说,我

们使用 cat 去读取 ~/.bashrc ,就会更新 atime 了。

那该如何让该档案的时间变成『现在』的时刻呢? 很简单啊!就用『touch』这个指令即可!
touch 文件名
参数∶
-a  ∶仅修订 access time;
-c  ∶仅修改时间,而不建立档案;
-d  ∶后面可以接日期,也可以使用 --date="日期或时间"
-m  ∶仅修改 mtime ;
-t  ∶后面可以接时间,格式为[YYMMDDhhmm]

在预设的状态下,即不加任何参数时,如果 touch 后面有接文件名,
则该档案的三个时间 (atime/ctime/mtime) 都会更新为目前的时间。若该档案不存在,
则会主动的建立一个新的空的档案喔!

档案与目录的预设权限与隐藏权限

例题二∶你的系统有个一般身份使用者 dmtsai,他的群组为 users,他的家目录在 /home/dmtsai,你想

将你的 ~/.bashrc 复制给他(假设你是 root),可以怎么作?
答∶
cp ~/.bashrc ~dmtsai/bashrc
chown dmtsai:users ~dmtsai/bashrc

例题三∶我想在 /tmp 底下建立一个目录,这个目录名称为 chap2_2_ex1 ,并且,这个目录拥有者为

dmtsai,群组为 users ,此外,任何人都可以进入该目录浏览档案,不过除了 dmtsai 之外,其他人都不

能修改该目录下的档案。
答∶
因为除了 dmtsai 之外,其他人不能修改该目录下的档案,此外, dmtsai 可以修改,所以整个目录的权

限应该是 drwxr-xr-x 才对!因此
mkdir /tmp/chap2_2_ex1
chown -R dmtsai:users /tmp/chap2_2_ex1
chmod -R 755 /tmp/chap2_2_ex1

档案类型∶file
如果你想要知道某个档案的基本资料,例如是属于 ASCII 或者是 data 档案,或者是 binary , 且其中

有没有使用到动态函式库 (share library) 等等的资讯,就可以利用 file 这个指令来检阅喔!

档案的搜寻
通常我们都是先使用 whereis 或者是 locate 来检查,如果真的找不到了,才以 find 来搜寻呦!为什么

呢?因为 whereis 与 locate 是利用资料库来搜寻资料,所以相当的快速,而且并没有实际的搜寻硬碟,

比较省时间啦!
which (寻找『执行档』)
which [-a] command
参数∶
-a ∶将所有可以找到的指令均列出,而不止第一个被找到的指令名称
例如:which ls   执行结果:/bin/ls
这个指令是根据『PATH』这个环境变数所规范的路径,去搜寻『执行档』的档名


whereis (寻找特定档案)
whereis [-bmsu] 档案或目录名
参数∶
-b    :只找 binary 的档案
-m    :只找在说明档 manual 路径下的档案
-s    :只找 source 来源档案
-u    :没有说明档的档案!
find 这个搜寻指令, find 是很强大的搜寻指令,但时间花用的很大! (因为 find 是直接搜寻硬碟

locate:定位
locate 的使用更简单,直接在后面输入『档案的部分名称』后,就能够得到结果。
我输入 locate passwd ,那么在完整档名 (包含路径名称) 当中,只要有 passwd 在其中, 就会被显示

出来的!

find
find [PATH] [option] [action]
参数∶
1. 与时间有关的参数∶
   -atime n ∶n 为数字,意义为在 n 天之前的『一天之内』被 access 过的档案;
   -ctime n ∶n 为数字,意义为在 n 天之前的『一天之内』被 change 过状态的档案;
   -mtime n ∶n 为数字,意义为在 n 天之前的『一天之内』被 modification 过的档案;
   -newer file ∶file 为一个存在的档案,意思是说,只要档案比 file 还要新,
                 就会被列出来~
2. 与使用者或群组名称有关的参数∶
   -uid n ∶n 为数字,这个数字是使用者的帐号 ID,亦即 UID ,这个 UID 是记录在
            /etc/passwd 里面与帐号名称对应的数字。这方面我们会在第四篇介绍。
   -gid n ∶n 为数字,这个数字是群组名称的 ID,亦即 GID,这个 GID 记录在
            /etc/group,相关的介绍我们会第四篇说明~
   -user name ∶name 为使用者帐号名称喔!例如 dmtsai
   -group name∶name 为群组名称喔,例如 users ;
   -nouser    ∶寻找档案的拥有者不存在 /etc/passwd 的人!
   -nogroup   ∶寻找档案的拥有群组不存在于 /etc/group 的档案!
                当您自行安装软体时,很可能该软体的属性当中并没有档案拥有者,
                这是可能的!在这个时候,就可以使用 -nouser 与 -nogroup 搜寻。
3. 与档案权限及名称有关的参数∶
   -name filename∶搜寻档案名称为 filename 的档案;
   -size [+-]SIZE∶搜寻比 SIZE 还要大(+)或小(-)的档案。这个 SIZE 的规格有∶
                   c: 代表 byte, k: 代表 1024bytes。所以,要找比 50KB
                   还要大的档案,就是『 -size +50k 』
   -type TYPE    ∶搜寻档案的类型为 TYPE 的,类型主要有∶一般正规档案 (f),
                   装置档案 (b, c), 目录 (d), 连结档 (l), socket (s),
                   及 FIFO (p) 等属性。
   -perm mode  ∶搜寻档案属性『刚好等于』 mode 的档案,这个 mode 为类似 chmod
                 的属性值,举例来说, -rwsr-xr-x 的属性为 4755 !
   -perm -mode ∶搜寻档案属性『必须要全部囊括 mode 的属性』的档案,举例来说,
                 我们要搜寻 -rwxr--r-- ,亦即 0744 的档案,使用 -perm -0744,
                 当一个档案的属性为 -rwsr-xr-x ,亦即 4755 时,也会被列出来,
                 因为 -rwsr-xr-x 的属性已经囊括了 -rwxr--r-- 的属性了。
   -perm +mode ∶搜寻档案属性『包含任一 mode 的属性』的档案,举例来说,我们搜寻
                 -rwxr-xr-x ,亦即 -perm +755 时,但一个档案属性为 -rw-------
                 也会被列出来,因为他有 -rw.... 的属性存在!
4. 额外可进行的动作∶
   -exec command ∶command 为其他指令,-exec 后面可再接额外的指令来处理搜寻到
                   的结果。
   -print        ∶将结果列印到萤幕上,这个动作是预设动作!





『新增一个档案或目录时,预设的权限是什么?』这个议题!
档案预设权限∶umask
umask 就是指定 『目前使用者在建立档案或目录时候的属性预设值』, 那么如何得知或设定 umask 呢?
[root@linux ~]# umask
0022
[root@linux ~]# umask -S
u=rwx,g=rx,o=rx

一种则是加入 -S (Symbolic) 这个参数,就会以符号类型的方式来显示出权限了! 奇怪的是,怎么

umask 会有四组数字啊?不是只有三组吗?是没错啦~ 第一组是特殊权限用的。
在预设权限的属性上,目录与档案是不一样的。由于档案我们不希望他具有可执行的权力, 预设情况中,

档案是没有可执行 (x) 权限的。因此∶
若使用者建立为『档案』则预设『没有可执行 ( x ) 项目』,亦即只有 rw 这两个项目,也就是最大为

666 分,预设属性如下∶
-rw-rw-rw-


若使用者建立为『目录』,则由于 x 与是否可以进入此目录有关,因此预设为所有权限均开放,亦即为

777 分,预设属性如下∶
drwxrwxrwx
那么 umask 指定的是『该预设值需要减掉的权限!』因为 r、w、x 分别是 4、2、1 分,所以棉!也就是

说,当要拿掉能写的权限,就是输入 2 分,而如果要拿掉能读的权限,也就是 4 分,那么要拿掉读与写

的权限,也就是 6 分,而要拿掉执行与写入的权限,也就是 3 分,这样了解吗?请问您, 5 分是什么?

呵呵! 就是读与执行的权限啦!如果以上面的例子来说明的话,因为 umask 为 022 ,所以 user 并没有

被拿掉属性,不过 group 与 others 的属性被拿掉了 2 ( 也就是 w 这个属性 ),那么由于当使用者∶
建立档案时∶(默认属性-rw-rw-rw-) ˉ (-----w--w-) ==> -rw-r--r--
建立目录时∶(默认drwxrwxrwx) ˉ (d----w--w-) ==> drwxr-xr-x
那么如何设定 umask 呢? 简单的很,直接在 umask 后面输入 002 就好了!

例题四∶假设您的 umask 为 003 ,请问该 umask 情况下,建立的档案与目录权限为?
答∶
umask 为 003 ,所以拿掉的属性为 其他人的--------wx,因此∶
档案∶ (-rw-rw-rw-) - (--------wx) = -rw-rw-r--
目录∶ (drwxrwxrwx) - (--------wx) = drwxrwxr--

档案隐藏属性∶
chattr (设定档案隐藏属性)
chattr [+-=][ASacdistu] 档案或目录名称
参数∶
+   ∶增加某一个特殊参数,其他原本存在参数则不动。
-   ∶移除某一个特殊参数,其他原本存在参数则不动。
=   ∶设定一定,且仅有后面接的参数

A  ∶当设定了 A 这个属性时,这个档案(或目录)的存取时间 atime (access)
     将不可被修改,可避免例如手提式电脑容易有磁碟 I/O 错误的情况发生!
S  ∶这个功能有点类似 sync 的功能!就是会将资料同步写入磁碟当中!
     可以有效的避免资料流失!
a  ∶当设定 a 之后,这个档案将只能增加资料,而不能删除,只有 root
     才能设定这个属性。
c  ∶这个属性设定之后,将会自动的将此档案『压缩』,在读取的时候将会自动解压缩,
     但是在储存的时候,将会先进行压缩后再储存(看来对于大档案似乎蛮有用的!)
d  ∶当dump(备份)程序被执行的时候,设定 d 属性将可使该档案(或目录)不具有dump功能
i  ∶这个 i 可就很厉害了!他可以让一个档案『不能被删除、改名、设定连结也无法写入
     或新增资料!』对于系统安全性有相当大的助益!
j  ∶当使用 ext3 这个档案系统格式时,设定 j 属性将会使档案在写入时先记录在
     journal 中!但是当 filesystem 设定参数为 data=journalled 时,由于已经设定了
     日了,所以这个属性无效!
s  ∶当档案设定了 s 参数时,他将会被完全的移除出这个硬碟空间。
u  ∶与 s 相反的,当使用 u 来设定档案时,则资料内容其实还存在磁碟中,
     可以使用来 undeletion.
注意∶这个属性设定上面,比较常见的是 a 与 i 的设定值,而且很多设定值必须要身为
root 才能够设定的喔!


lsattr (显示档案或目录的隐藏属性)
参数∶
-a ∶将隐藏档的属性也秀出来;
-R ∶连同子目录的资料也一并列出来!
分享到:
评论

相关推荐

    Linux文件和目录操作命令

    ### Linux文件和目录操作命令详解 #### 一、概述 Linux作为一款强大的开源操作系统,广泛应用于服务器、桌面以及嵌入式设备等领域。对于初学者来说,掌握基本的文件和目录操作命令至关重要。本文将深入介绍Linux...

    linux文件系统及文件操作命令

    Linux 文件系统及文件操作命令 Linux 文件系统是指 Linux 操作系统中用于存储和管理文件的系统。它提供了一个层次结构化的文件系统,允许用户存储、管理和访问文件。Linux 文件系统由多个目录组成,每个目录可以...

    linux操作系统实验文件和目录操作报告.pdf

    Linux 操作系统文件和目录操作报告 Linux 操作系统中的文件类型可以...在 Linux 操作系统中,文件操作命令非常丰富,包括 touch、cp、mv、rm、cat、find 等命令。这些命令可以帮助用户高效地管理和操作文件和目录。

    Linux文件和目录操作命令后面可以跟的选项后缀.docx

    Linux 文件和目录操作命令选项后缀详解 Linux 操作系统中,文件和目录操作命令都是非常重要的基本技能,然而,许多用户对这些命令的选项后缀不甚了解,本文将对常见的 Linux 文件和目录操作命令的选项后缀进行详细...

    linux常用命令含目录操作目录,文件操作命令等等

    以下是 Linux 中常用的命令,包括目录操作命令、文件操作命令和权限操作命令。 目录操作命令 1. ls 命令:列出文件或目录下的文件名 语法:ls [-atFlgR] [name] 示例:[#root@rhel4 ~]# ls -la /home //列出/...

    Linux常用文件命令

    Linux提供了多种文件操作命令,包括cat、man、ln等。cat命令用于查看文件内容,man命令用于显示命令的用法,ln命令用于创建文件链接。使用ln命令可以创建硬链接和符号链接,硬链接用于创建文件的多个名称,符号链接...

    实验85-Linux命令:文件操作命令1

    在Linux操作系统中,掌握基础的文件操作命令对于日常的系统管理和运维工作至关重要。本实验重点介绍了三个常用的文件操作命令:`touch`、`cat`和`more`,旨在帮助用户熟练掌握这些命令的使用方法。 首先,我们来看`...

    Linux文件操作最常用命令.pdf

    Linux文件操作最常用命令包括了文件创建、查看、删除、复制、移动、重命名、解压压缩以及查找等操作。以下是各个操作对应的常用命令以及其使用方法和注意事项。 0. 新建操作: 新建文件夹可以使用`mkdir`命令,后接...

    Linux系统的基本操作及常用命令实验报告.doc

    Linux 系统的基本操作包括安装和使用 Linux 操作系统、熟悉 Ubuntu 操作系统的使用界面和各项功能、目录操作命令、文件操作命令、系统询问与权限命令、进程操作命令等。 目录操作命令是 Linux 操作系统中最基本的...

    实验 Linux文件和目录操作.pdf

    Linux 文件和目录操作 Linux 操作系统中,文件和...本文介绍了 Linux 文件和目录操作的相关知识点,包括文件和目录的管理、文件内容的查阅等,并提供了实验指导,以帮助用户更好地掌握 Linux 文件和目录操作命令。

    linux文件目录和命令.pdf

    Linux文件系统和命令是其操作系统的基础,掌握它们对于Linux系统管理员和开发者来说至关重要。通过以上知识点的介绍,可以看出Linux系统无论是在其架构设计,还是在实际使用过程中,都强调了简洁、高效和灵活性,这...

    Linux安装和文件目录操作

    2. **熟悉Linux下的目录和文件命令**:学习并实践Linux系统中常用的文件和目录操作命令,包括但不限于`cd`(切换目录)、`ls`(列出目录内容)、`mkdir`(创建目录)、`pwd`(显示当前工作目录)、`find`(查找文件...

    Linux常用文件和目录操作命令思维导图

    Linux系统下常用文件和目录操作命令的思维导图,零积分下载。

    Linux操作系统的常用命令

    Linux 操作系统提供了许多实用的命令来帮助用户管理和操作文件、目录、网络等。以下是 Linux 操作系统中的一些常用命令的总结: 文件和目录操作 * ls 命令:用于查看当前目录下的文件和目录列表。可以使用 -a 选项...

    Linux常见命令总结 、基本命令、目录操作命令、文件操作命令、压缩文件操作、查找命令、权限命令、其他命令

    三、文件操作命令 1. **新建文件**:`touch filename` 创建新文件。 2. **修改文件**:`vi filename` 使用vi编辑器打开并编辑文件。 3. **查看文件大小**:`du -sh directory` 查看目录大小,`ls -lh` 查看文件和...

    实验2-Linux命令操作实验—文件目录1

    实验2-Linux命令操作实验—文件目录1主要涵盖了Linux操作系统中的基本命令和shell的使用,旨在帮助用户熟悉命令行界面,提高操作效率。以下是实验涉及的知识点详解: 1. **Shell**:Shell是Linux系统中的一种命令...

    Linux文件操作和用户管理

    首先,Linux文件操作是日常工作中最为常用的部分。在Linux系统中,所有内容都被视作文件,包括普通文件、目录文件(或称为文件夹)、设备文件等。文件操作包括但不限于创建、删除、复制、移动、编辑、权限修改等。 ...

    Linux文件系统目录结构的详细解说2.pdf

    Linux 文件系统目录结构是 Linux 操作系统的根目录结构,它是 Linux 文件系统的组织者,也是最上级的领导者。 Linux 文件系统的目录结构可以用树形结构来形象地描述。在 Linux 文件系统中,有四种基本文件系统类型:...

    linux文件系统详解及常用命令

    Linux 文件系统详解及常用命令 Linux 文件系统是 Linux 操作系统的核心组件之一,它提供了文件存储和管理的机制。Linux 文件系统的结构是一个树状结构,以根目录(root)为中心,其他目录都是从根目录下派生出来的...

Global site tag (gtag.js) - Google Analytics