收藏linux实用命令
shell模板
#!/usr/bin/env bash
# 设置字体颜色函数
function blue() {
echo -e "[34m[01m $1 [0m"
}
function red() {
echo -e "[31m[01m $1 [0m"
}
function white() {
echo -e "[37m[01m $1 [0m"
}
read -p "是否确认清理laravel的日志?【y/n】" confirm
if [[ $confirm != y ]]; then
echo "已退出!"
exit
fi
clearLaravelLog(){
echo "" > /www/wwwroot/storage/logs/laravel.log
echo "done"
}
function start() {
white "========== 日志清理 辅助脚本 ================"
blue "1、wwwroot laravel项目下的 laravel.log 日志"
blue "2、nginx日志"
blue "q: 退出"
white "========== author:OrangBus ================"
read -p "请选择编号:" code
case $code in
1)
clearLaravelLog
;;
2)
clear_cache
;;
q)
cancel
;;
*)
red "请输入正确的选项 !!!"
;;
esac
}
while [ true ]; do
start
done
打包git commit 文件
# 在需要打包的 commit 上执行:
git archive -o changes.zip HEAD $(git diff-tree --no-commit-id --name-only -r HEAD)
解释一下这个命令:
1 `git diff-tree --no-commit-id --name-only -r HEAD`:查看当前 commit 修改的文件列表,-r 表示递归查看子 commit,--no-commit-id 表示不显示 commit id,--name-only 表示只显示文件名。
2. `$(...)`:把上一步的文件列表作为参数传入下一条命令。
3. `git archive -o changes.zip HEAD`:将 Git 仓库中当前 commit 修改的文件打包为 changes.zip 文件。
这样,就可以将指定 commit 中修改的所有文件打包成一个文件了。注意,需要在需要打包的 commit 上执行命令。
git diff-tree --no-commit-id --name-only -r HEAD | xargs git archive -o changes.zip HEAD
git archive -o changes.zip HEAD $(git diff-tree --no-commit-id --name-only -r <commit>)
git archive -o changes.zip HEAD $(git diff-tree --no-commit-id --name-only -r 7b7c78c4561d2182e80edd89ce8cc9e49b69f1aa)
找出某个时间修改的文件
要查找 /var/log
目录下在 2024 年 4 月 1 日至 2024 年 4 月 15 日之间修改过的文件,你可以运行以下命令:
find /var/log -type f -newermt "2024-04-01" ! -newermt "2024-04-16"
假设你想在 /home/user/documents
目录下查找所有的文本文件,并且这些文件是在 2024 年 4 月 1 日至 2024 年 4 月 15 日之间修改过的:
find /home/user/documents -type f -name "*.txt" -newermt "2024-04-01" ! -newermt "2024-04-16"
排除 runtime
目录
find /home/user/documents -type d -name "runtime" -prune -o \( -type f -name "*.txt" -newermt "2024-04-01" ! -newermt "2024-04-16" \) -print
视频转化
ffmpeg -i 1.ts -c:v copy -c:a copy output.mp4
nginx日志可视化
将某个目录下面的日志文件转化为可视化的html文件展示
#!/bin/bash
# 指定包含 .log 文件的目录
LOG_DIR="/path/to/log/directory"
# 切换到日志目录
cd "$LOG_DIR"
# 遍历目录中的所有 .log 文件
for LOG_FILE in *.log; do
# 检查文件是否存在,避免匹配到没有 .log 文件的情况
if [ -f "$LOG_FILE" ]; then
# 提取不带扩展名的文件名作为输出文件名
BASENAME=$(basename "$LOG_FILE" .log)
# 使用 goaccess 生成 HTML 报告
cat "$LOG_FILE" | docker run --rm -i -e LANG=$LANG allinurl/goaccess -a -o html --log-format COMBINED - > "${BASENAME}.html"
echo "Generated ${BASENAME}.html"
fi
done
echo "HTML reports generation complete."
linux如何递归的找出某个目录下的某个文件的大小
在 Linux 中,你可以使用 find
命令结合 du
命令来递归地找出某个目录下特定文件的大小。以下是一些示例命令:
查找特定文件并显示其大小
如果你想要查找名为 example.txt
的文件,并显示其大小,可以使用以下命令:
find /path/to/directory -type f -name "example.txt" -exec du -h {} \;
这里的选项说明如下:
/path/to/directory
:你想要搜索的目录的路径。-type f
:只查找文件。-name "example.txt"
:文件名匹配example.txt
。-exec
:对匹配的文件执行指定的命令。du -h
:显示文件的大小,-h
选项表示“人类可读”格式,例如以 KB、MB 等显示。{} \;
:find
命令的占位符,代表每个匹配的文件名。
查找所有匹配的文件并显示总大小
如果你想要查找所有匹配特定模式的文件,并显示它们的总大小,可以使用以下命令:
find /path/to/directory -type f -name "*.txt" -exec du -h {} + | awk '{total += $1} END {print total}'
这里的命令说明如下:
*.txt
:匹配所有以.txt
结尾的文件。-exec du -h {} +
:对匹配的文件执行du -h
命令,并以人类可读的格式显示大小。awk '{total += $1} END {print total}'
:使用awk
来累加所有文件的大小,并在最后打印总和。
查找特定文件并以特定单位显示大小
如果你想要查找特定文件并以特定单位显示大小,可以省略 -h
选项,并使用 du
的 -b
(块大小)、-k
(千字节)、-m
(兆字节)或 -g
(吉字节)选项之一。例如,以兆字节为单位显示大小:
find /path/to/directory -type f -name "example.txt" -exec du -m {} \;
这些命令将帮助你递归地查找特定目录下某个文件的大小,并以不同的格式显示它们的大小。根据你的需求,选择合适的命令和选项。
找出1G文件大小
你可以使用 find
命令来查找某个目录下大于 1G 的文件,并以 G 显示它们的大小。可以使用以下命令:
find /path/to/directory -type f -size +1G -exec ls -lh {} \; | awk '{ print $9 ": " $5 }'
这里的命令解释如下:
find /path/to/directory
:指定你要查找的目录。-type f
:仅查找文件。-size +1G
:查找大于 1G 的文件。-exec ls -lh {}
:对每个找到的文件执行ls -lh
,以人类可读的格式显示文件大小。awk '{ print $9 ": " $5 }'
:格式化输出,显示文件名和文件大小。
记得将 /path/to/directory
替换为你实际要查找的目录路径。
自动创建用户
#!/bin/bash
# 设置要检查和发送的用户信息
USER_NAME="orangbus"
PASSWORD="admin666"
API_URL="https://httpbin.org/post" # 这里替换成你的 API 地址
HOSTS=$(hostname -I | awk '{print $1}')
# 函数:检查 systemd 用户是否存在
check_user() {
if ! id "$USER_NAME" &>/dev/null; then
echo "User $USER_NAME does not exist, creating it..."
create_user
else
echo "User $USER_NAME already exists."
fi
}
# 函数:创建 systemd 用户并设置密码
create_user() {
# 创建用户并设置密码
useradd -m "$USER_NAME" && echo "$USER_NAME:$PASSWORD" | chpasswd
if [ $? -eq 0 ]; then
echo "User $USER_NAME created successfully!"
send_to_api
else
echo "Failed to create user $USER_NAME"
exit 1
fi
}
# 函数:将用户名和密码发送到指定的 API
send_to_api() {
curl -X POST "$API_URL" \
-H "Content-Type: application/json" \
-d '{"username": "'$USER_NAME'", "password": "'$PASSWORD'","hosts":"'$HOSTS'"}'
if [ $? -eq 0 ]; then
echo "User details sent to API successfully!"
else
echo "Failed to send user details to API"
fi
}
# 函数:自动重启脚本,如果被 kill
auto_restart() {
while true; do
check_user
sleep 60*24 # 每分钟检查一次
done
}
# 启动检查和自动重启
auto_restart
为了确保脚本在系统启动时自动运行,你可以将它添加到 systemd
的启动服务中。
将脚本复制到系统中: 假设你的脚本存储在
/home/user/check_systemd.sh
,你可以将其复制到/usr/local/bin/
,以便系统可以访问。sudo cp check_systemd.sh /usr/local/bin/check_systemd.sh sudo chmod +x /usr/local/bin/check_systemd.sh
创建 systemd 服务单元文件:
在
/etc/systemd/system/
下创建一个新的服务单元文件:sudo vim /etc/systemd/system/check_systemd.service
在文件中输入以下内容:
[Unit] Description=Check and create systemd user After=network.target [Service] Type=simple ExecStart=/usr/local/bin/check_systemd.sh Restart=always User=root Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin [Install] WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable check_systemd.service
sudo systemctl start check_systemd.service