简介

  • 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. 按指定规则排序文件

结合 findsort 命令,可以按照更加复杂的规则进行排序。例如,按文件大小排序:

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. 使用 trwhile 循环

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 的内置功能 sedawk 或字符串操作函数来实现。下面是一些方法示例:

使用 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 '' 的配合,确保了对文件名中可能包含的空格进行正确处理。