简介
- shell编程常用技巧
linux 目录下按照规则排序文件
在 Linux 中,可以使用 ls
命令结合不同的选项来按照规则排序目录下的文件。以下是一些常用的示例和方法:
1. 按文件名排序
默认情况下,ls
命令按文件名的字母顺序排序:
1
ls
2. 按文件大小排序
使用 -S
选项按文件大小排序:
1
ls -lS
3. 按修改时间排序
使用 -t
选项按修改时间排序:
1
ls -lt
4. 按访问时间排序
使用 -u
选项按访问时间排序:
1
ls -lu
5. 按文件创建时间排序(有些文件系统不支持)
使用 -c
选项按文件创建时间排序:
1
ls -lc
6. 逆序排序
使用 -r
选项逆序排列:
1
ls -lr
7. 按扩展名排序
使用 --sort=extension
按扩展名排序:
1
ls -l --sort=extension
8. 按文件大小排序并显示人类可读格式
使用 -h
选项结合 -S
选项:
1
ls -lSh
9. 按指定规则排序文件
结合 find
和 sort
命令,可以按照更加复杂的规则进行排序。例如,按文件大小排序:
1
find . -type f -exec ls -l {} + | sort -k 5 -n
10. 按文件名排序,并忽略大小写
使用 -f
选项结合 sort
命令:
1
ls | sort -f
示例
假设有一个目录,里面包含以下文件:
1
2
3
4
5
file1.txt
file2.txt
fileA.txt
fileB.txt
file10.txt
按文件名排序(忽略大小写)
1
ls | sort -f
输出:
1
2
3
4
5
file1.txt
file10.txt
file2.txt
fileA.txt
fileB.txt
按文件大小排序
1
ls -lS
输出(假设文件大小分别为 100B, 200B, 150B, 50B, 250B):
1
2
3
4
5
-rw-r--r-- 1 user group 250 Apr 10 10:00 file10.txt
-rw-r--r-- 1 user group 200 Apr 10 10:00 file2.txt
-rw-r--r-- 1 user group 150 Apr 10 10:00 fileA.txt
-rw-r--r-- 1 user group 100 Apr 10 10:00 file1.txt
-rw-r--r-- 1 user group 50 Apr 10 10:00 fileB.txt
总结
通过结合使用 ls
命令的不同选项以及 sort
命令,你可以根据各种规则对目录下的文件进行排序。选择适合你需求的命令和选项,并根据需要进行调整。
shell 字符串分割
在 Shell 中,可以使用多种方法来分割字符串。下面是几种常见的方法:
1. 使用 IFS
(内部字段分隔符)
使用 IFS
变量可以轻松地将字符串分割成数组。以下是一个示例,将逗号分隔的字符串分割成数组:
1
2
3
4
5
6
7
8
9
10
#!/bin/bash
str="apple,banana,cherry"
IFS=',' read -r -a array <<< "$str"
# 输出数组元素
for element in "${array[@]}"
do
echo "$element"
done
2. 使用 cut
cut
命令可以从字符串中提取字段。以下是一个示例,使用逗号作为分隔符:
1
2
3
4
5
6
#!/bin/bash
str="apple,banana,cherry"
echo "$str" | cut -d',' -f1 # apple
echo "$str" | cut -d',' -f2 # banana
echo "$str" | cut -d',' -f3 # cherry
3. 使用 awk
awk
是一个强大的文本处理工具,可以用来分割字符串。以下是一个示例:
1
2
3
4
5
6
#!/bin/bash
str="apple,banana,cherry"
echo "$str" | awk -F',' '{print $1}' # apple
echo "$str" | awk -F',' '{print $2}' # banana
echo "$str" | awk -F',' '{print $3}' # cherry
4. 使用 tr
和 while
循环
tr
命令可以用来替换字符。结合 while
循环,可以逐个处理字符串中的每个部分。以下是一个示例:
1
2
3
4
5
6
7
#!/bin/bash
str="apple,banana,cherry"
echo "$str" | tr ',' '\n' | while read element
do
echo "$element"
done
5. 使用参数扩展
在 Bash 中,还可以使用参数扩展进行简单的字符串分割:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash
str="apple,banana,cherry"
# 截取第一个逗号前的部分
part1="${str%%,*}"
echo "$part1" # apple
# 截取第一个逗号后的部分
remaining="${str#*,}"
# 再次截取
part2="${remaining%%,*}"
echo "$part2" # banana
part3="${remaining#*,}"
echo "$part3" # cherry
这些方法可以帮助你在 Shell 脚本中进行字符串分割。选择最适合你需求的方法,并根据需要调整分隔符和字符串。
在shell script中以某用户身份执行命令
1
2
3
#!/bin/bash
sudo -S bash -c 'whoami'
whoami
linux 写一个定时刷新的24h运行脚本
你可以使用crontab
来创建一个定时刷新的脚本。crontab
是一个用于在Linux系统上定期执行任务的工具。下面是一个示例,假设你有一个名为refresh.sh
的脚本,你想每天定时运行:
首先,创建一个refresh.sh
脚本:
1
2
3
4
5
6
7
8
#!/bin/bash
# 这是你的刷新任务脚本内容
# 例如,你可以在这里写下你想要执行的任务
# 比如,刷新某个文件夹下的内容
echo "Running refresh script at $(date)"
# 在这里执行你的刷新任务
保存并退出。
接下来,编辑你的crontab
:
1
crontab -e
在编辑器中添加以下行,表示每天的0点执行refresh.sh
脚本:
1
0 0 * * * /path/to/refresh.sh
确保将/path/to/refresh.sh
替换为你实际的refresh.sh
脚本的路径。
保存并退出编辑器。
这将使你的refresh.sh
脚本每天的午夜被执行,从而实现了24小时定时刷新的需求。
linux stat 获取指定目录的空闲空间
你可以使用 stat
命令获取文件系统的信息,但是 stat
命令不能直接获取指定目录的空闲空间。要获取指定目录的空闲空间,你可以使用 df
命令。
以下是一个示例 Bash 脚本,用于获取指定目录的空闲空间:
1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
# 指定要获取空间信息的目录
directory="/path/to/your/directory"
# 获取目录所在的文件系统
filesystem=$(df -P "$directory" | awk 'NR==2 {print $1}')
# 获取文件系统的空闲空间
free_space=$(df -P "$filesystem" | awk 'NR==2 {print $4}')
echo "Free space in $directory : $free_space"
在这个脚本中,你需要将 /path/to/your/directory
替换为你要查询空间信息的目录路径。脚本将首先使用 df
命令获取该目录所在的文件系统,然后再次使用 df
命令获取该文件系统的空闲空间。最后,脚本会输出空闲空间的信息。
请注意,这个脚本只是一个简单的示例,适用于大多数情况。在实际使用中,你可能需要更复杂的逻辑来确保脚本的稳健性和安全性。
linux bash 字符串删除
如果你要删除字符串中的特定字符或子字符串,你可以使用 Bash 的内置功能 sed
、awk
或字符串操作函数来实现。下面是一些方法示例:
使用 sed
删除字符串中的字符:
1
2
3
4
5
6
7
8
9
10
#!/bin/bash
# 原始字符串
original_string="Hello World"
# 删除字符串中的空格
modified_string=$(echo "$original_string" | sed 's/ //g')
echo "Original string: $original_string"
echo "Modified string: $modified_string"
使用 awk
删除字符串中的字符:
1
2
3
4
5
6
7
8
9
10
#!/bin/bash
# 原始字符串
original_string="Hello World"
# 删除字符串中的空格
modified_string=$(echo "$original_string" | awk '{gsub(" ", "")}1')
echo "Original string: $original_string"
echo "Modified string: $modified_string"
使用字符串操作函数删除字符串中的子字符串:
1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
# 原始字符串
original_string="Hello World"
# 删除字符串中的 "llo" 子字符串
substring_to_remove="llo"
modified_string="${original_string//$substring_to_remove}"
echo "Original string: $original_string"
echo "Modified string: $modified_string"
这些示例中,原始字符串是 “Hello World”,然后使用不同的方法删除了其中的空格或子字符串。你可以根据自己的需求选择其中一种方法。
linux bash 获取docker容器的id
要获取正在运行的 Docker 容器的 ID,你可以使用 Docker 命令行工具。以下是使用 docker ps
命令来获取正在运行容器的 ID 的示例:
1
2
3
4
5
6
#!/bin/bash
# 获取正在运行的容器的 ID
container_id=$(docker ps -q)
echo "Running Docker container ID: $container_id"
在这个脚本中,docker ps -q
命令用于列出正在运行的容器,并使用 -q
参数只显示容器的 ID。然后将结果存储在 container_id
变量中,并输出该变量的值。
这只会获取第一个正在运行的容器的 ID。如果你想获取特定容器的 ID,你可以使用 docker ps -qf
命令并提供过滤条件,如容器的名称、标签等。例如,要获取名称为 my_container
的容器的 ID,你可以使用以下命令:
1
container_id=$(docker ps -qf "name=my_container")
你可以根据自己的需要调整这些命令。
linux find命令找到指定文件并保存到数组中
在Linux中,find
命令用于查找文件和目录。如果你想使用find
命令找到指定文件并将结果保存到一个数组中,你可以使用以下方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 1. 使用 find 命令查找指定文件,并将结果保存到数组
files_array=($(find /path/to/search -name "your_pattern"))
# 2. 输出数组内容(可选)
echo "Files found:"
for file in "${files_array[@]}"; do
echo "$file"
done
cmd="libtool -static -o libabsl.a "
for file in "${files_array[@]}"; do
cmd="${cmd} ${file}"
done
echo "cmd:"
echo ${cmd}
在这个例子中:
/path/to/search
是你要搜索的目录的路径。"your_pattern"
是你要匹配的文件名模式。你可以使用通配符来匹配文件名的一部分,比如*.txt
表示所有以.txt
结尾的文件。files_array
是保存文件列表的数组。
请注意,上述代码假设文件和目录名不包含空格。如果你的文件名中可能包含空格,建议使用更复杂的方法来处理,比如使用 find
命令的 -print0
选项以及 readarray
命令:
1
2
3
4
5
6
7
8
# 使用 find 命令查找指定文件,将结果以空字符分隔保存到数组
readarray -d '' files_array < <(find /path/to/search -name "your_pattern" -print0)
# 输出数组内容
echo "Files found:"
for file in "${files_array[@]}"; do
echo "$file"
done
这种方法通过 -print0
选项和 readarray -d ''
的配合,确保了对文件名中可能包含的空格进行正确处理。