pwd 命令详解#
pwd(print working directory)是 Linux 系统中用于显示当前工作目录绝对路径的命令,是最基本、最常用的目录操作命令之一。
入门#
基本用法#
# 显示当前工作目录的绝对路径
pwd
# 显示当前工作目录的物理路径(不跟随符号链接)
pwd -P
# 显示当前工作目录的逻辑路径(跟随符号链接,默认)
pwd -L常用选项#
| 选项 | 说明 |
|---|---|
-P | 显示物理路径,不跟随符号链接 |
-L | 显示逻辑路径,跟随符号链接(默认) |
--help | 显示帮助信息 |
--version | 显示版本信息 |
基本示例#
# 显示当前目录
pwd
# 输出: /home/user/Documents
# 显示物理路径
pwd -P
# 输出: /home/user/Documents
# 在符号链接目录中使用
ln -s /home/user/Documents /home/user/link
cd /home/user/link
pwd
# 输出: /home/user/link
pwd -P
# 输出: /home/user/Documents中级#
高级用法#
# 结合其他命令
ls -la $(pwd)
# 在脚本中使用
echo "Current directory: $(pwd)"
# 保存当前目录
CURRENT_DIR=$(pwd)
echo "Saved directory: $CURRENT_DIR"
# 与变量结合
dir=$(pwd)
cd /tmp
# 做一些操作
cd "$dir"
echo "Back to: $(pwd)"环境变量#
# 查看 PWD 环境变量
echo $PWD
# 查看 OLDPWD 环境变量(上一个工作目录)
echo $OLDPWD
# 设置自定义环境变量
export MY_DIR=$(pwd)
echo $MY_DIR脚本集成#
# 目录检查脚本
#!/bin/bash
function check_directory() {
local dir="$1"
if [ -z "$dir" ]; then
dir=$(pwd)
fi
if [ -d "$dir" ]; then
echo "Directory exists: $dir"
echo "Absolute path: $(cd "$dir" && pwd)"
else
echo "Error: Directory does not exist: $dir"
fi
}
# 目录备份脚本
#!/bin/bash
function backup_directory() {
local dir="$1"
local dest="$2"
if [ -z "$dir" ]; then
dir=$(pwd)
fi
if [ -z "$dest" ]; then
dest="$HOME/backup"
fi
local backup_name=$(basename "$dir")_$(date +%Y-%m-%d_%H-%M-%S)
local backup_path="$dest/$backup_name"
echo "Backing up $(pwd) to $backup_path"
tar -czf "$backup_path.tar.gz" "$dir"
echo "Backup completed: $backup_path.tar.gz"
}
# 目录比较脚本
#!/bin/bash
function compare_directories() {
local dir1="$1"
local dir2="$2"
if [ -z "$dir1" ]; then
dir1=$(pwd)
fi
if [ -z "$dir2" ]; then
echo "Usage: compare_directories <directory1> <directory2>"
return 1
fi
echo "Comparing $dir1 and $dir2"
diff -r "$dir1" "$dir2"
}实用技巧#
# 快速查看目录路径长度
echo "Path length: $(pwd | wc -c)"
# 提取目录名
echo "Directory name: $(basename $(pwd))"
# 提取父目录
echo "Parent directory: $(dirname $(pwd))"
# 检查目录深度
echo "Directory depth: $(pwd | tr '/' '\n' | wc -l)"
# 目录路径转换
echo "Uppercase: $(pwd | tr '[:lower:]' '[:upper:]')"
echo "No spaces: $(pwd | tr ' ' '_')"高级#
复杂应用#
# 结合 find 命令
find $(pwd) -name "*.txt" -type f | head -n 5
# 结合 grep 命令
ls -la $(pwd) | grep "^d"
# 结合 sed 命令
pwd | sed 's/old/new/'
# 结合 awk 命令
pwd | awk -F/ '{print $NF}'
# 结合 xargs 命令
find $(pwd) -name "*.log" -type f | xargs ls -la系统管理#
# 系统目录检查
cd /etc && pwd && ls -la
cd /var/log && pwd && ls -la
cd /proc && pwd && ls -la
# 用户目录管理
cd /home && pwd && ls -la
cd /root && pwd && ls -la
# 应用目录管理
cd /opt && pwd && ls -la
cd /usr/local && pwd && ls -la
# 临时目录管理
cd /tmp && pwd && ls -la
cd /var/tmp && pwd && ls -la自动化脚本#
# 目录结构报告脚本
#!/bin/bash
function directory_report() {
local dir="$1"
if [ -z "$dir" ]; then
dir=$(pwd)
fi
echo "Directory Report for: $dir"
echo "=================================="
echo "Absolute path: $(cd "$dir" && pwd)"
echo "Physical path: $(cd "$dir" && pwd -P)"
echo "Directory name: $(basename "$dir")"
echo "Parent directory: $(dirname "$dir")"
echo "Directory depth: $(cd "$dir" && pwd | tr '/' '\n' | wc -l)"
echo "=================================="
echo "Contents:"
ls -la "$dir"
}
# 目录监控脚本
#!/bin/bash
function monitor_directory() {
local dir="$1"
local interval="$2"
if [ -z "$dir" ]; then
dir=$(pwd)
fi
if [ -z "$interval" ]; then
interval=5
fi
echo "Monitoring directory: $dir"
echo "Interval: $interval seconds"
echo "=================================="
while true; do
echo "[$(date +%Y-%m-%d %H:%M:%S)] Current directory: $(pwd)"
echo "Files: $(ls -la "$dir" | wc -l)"
echo "----------------------------------"
sleep "$interval"
done
}
# 目录清理脚本
#!/bin/bash
function clean_directory() {
local dir="$1"
if [ -z "$dir" ]; then
dir=$(pwd)
fi
echo "Cleaning directory: $dir"
echo "=================================="
# 删除临时文件
find "$dir" -name "*.tmp" -delete
find "$dir" -name "*.swp" -delete
find "$dir" -name "*~" -delete
# 清理空目录
find "$dir" -type d -empty -delete
echo "Clean completed"
echo "Remaining files: $(ls -la "$dir" | wc -l)"
}与其他工具集成#
# 与 tree 命令结合
tree -L 2 $(pwd)
# 与 du 命令结合
du -sh $(pwd)
# 与 df 命令结合
df -h | grep $(pwd | cut -d/ -f1-3)
# 与 rsync 命令结合
rsync -av $(pwd) /backup/$(basename $(pwd))
# 与 scp 命令结合
scp -r $(pwd) user@remote:/path/to/dest大师#
高级技巧#
# 目录路径解析
function parse_path() {
local path="$1"
if [ -z "$path" ]; then
path=$(pwd)
fi
echo "Path: $path"
echo "Components:"
IFS='/' read -ra components <<< "$path"
for i in "${!components[@]}"; do
echo "$i: ${components[$i]}"
done
}
# 目录路径验证
function validate_path() {
local path="$1"
if [ -z "$path" ]; then
path=$(pwd)
fi
if [ -d "$path" ]; then
echo "✓ Directory exists: $path"
echo "✓ Absolute path: $(cd "$path" && pwd)"
echo "✓ Readable: $( [ -r "$path" ] && echo "yes" || echo "no" )"
echo "✓ Writable: $( [ -w "$path" ] && echo "yes" || echo "no" )"
echo "✓ Executable: $( [ -x "$path" ] && echo "yes" || echo "no" )"
else
echo "✗ Directory does not exist: $path"
fi
}
# 目录路径转换
function convert_path() {
local path="$1"
local format="$2"
if [ -z "$path" ]; then
path=$(pwd)
fi
case "$format" in
"relative")
echo "Relative path: $(realpath --relative-to=. "$path")"
;;
"absolute")
echo "Absolute path: $(realpath "$path")"
;;
"short")
echo "Short path: $(echo "$path" | sed 's|/home/[^/]*|~|')"
;;
*)
echo "Usage: convert_path [path] <relative|absolute|short>"
;;
esac
}
# 目录路径生成
function generate_path() {
local base="$1"
local components="$2"
if [ -z "$base" ]; then
base=$(pwd)
fi
if [ -z "$components" ]; then
echo "Usage: generate_path [base] <components>"
return 1
fi
local path="$base"
IFS=',' read -ra comps <<< "$components"
for comp in "${comps[@]}"; do
path="$path/$comp"
done
echo "Generated path: $path"
if [ ! -d "$path" ]; then
echo "Creating directory..."
mkdir -p "$path"
fi
echo "Final path: $(cd "$path" && pwd)"
}大规模目录管理#
# 批量目录检查
for dir in /path/to/dir*; do
if [ -d "$dir" ]; then
echo "Directory: $(cd "$dir" && pwd)"
echo "Files: $(ls -la "$dir" | wc -l)"
echo "----------------------------------"
fi
done
# 并行目录处理
ls -la ~/Projects | grep "^d" | awk '{print $9}' | xargs -P 4 -I {} sh -c 'cd ~/Projects/{} && echo "Directory: $(pwd), Files: $(ls -la | wc -l)"'
# 分布式目录扫描
find /path -type d -name "project*" | xargs -I {} sh -c 'cd {} && echo "Found: $(pwd)"'
# 目录统计
find /path -type d | xargs -I {} sh -c 'cd {} && echo "$(pwd),$(ls -la | wc -l)"' > directory_stats.csv自动化工作流#
# 开发工作流
function dev_workflow() {
local project="$1"
# 切换到项目目录
cd "$HOME/Projects/$project"
echo "Project: $project"
echo "Directory: $(pwd)"
echo "=================================="
# 检查 git 状态
git status
# 构建项目
make
# 运行测试
make test
echo "=================================="
echo "Workflow completed"
}
# 数据处理工作流
function data_workflow() {
local dataset="$1"
# 切换到数据目录
cd "$HOME/Data/$dataset"
echo "Dataset: $dataset"
echo "Directory: $(pwd)"
echo "=================================="
# 检查数据文件
ls -la
# 处理数据
echo "Processing data..."
# 执行数据处理命令
# 分析结果
echo "Analyzing results..."
# 执行分析命令
echo "=================================="
echo "Workflow completed"
}
# 系统管理工作流
function sysadmin_workflow() {
echo "System Admin Workflow"
echo "=================================="
# 检查系统目录
cd /etc && echo "Config directory: $(pwd)"
ls -la | head -n 10
cd /var/log && echo "Log directory: $(pwd)"
ls -la | head -n 10
cd /proc && echo "Proc directory: $(pwd)"
ls -la | head -n 10
echo "=================================="
echo "Workflow completed"
}与其他工具集成#
# 与 Docker 结合
docker run --rm -v $(pwd):/app alpine ls -la /app
# 与 Kubernetes 结合
kubectl exec -it pod-name -- sh -c "pwd && ls -la"
# 与 Git 结合
git rev-parse --show-toplevel # 显示 Git 仓库根目录
# 与 Maven 结合
mvn exec:java -Dexec.mainClass="com.example.Main" -Dexec.workingDirectory=$(pwd)
# 与 Gradle 结合
gradle build -p $(pwd)无敌#
高级技巧#
# 目录路径加密
function encrypt_path() {
local path="$1"
if [ -z "$path" ]; then
path=$(pwd)
fi
echo "Original path: $path"
echo "Encrypted: $(echo "$path" | base64)"
}
# 目录路径解密
function decrypt_path() {
local encrypted="$1"
if [ -z "$encrypted" ]; then
echo "Usage: decrypt_path <encrypted>"
return 1
fi
echo "Decrypted path: $(echo "$encrypted" | base64 -d)"
}
# 目录路径压缩
function compress_path() {
local path="$1"
if [ -z "$path" ]; then
path=$(pwd)
fi
# 替换常见路径前缀
local compressed=$(echo "$path" | sed 's|/home/[^/]*|~|' | sed 's|/usr/local|/ul|' | sed 's|/var/log|/vl|')
echo "Original path: $path"
echo "Compressed: $compressed"
}
# 目录路径展开
function expand_path() {
local path="$1"
if [ -z "$path" ]; then
path=$(pwd)
fi
# 展开 ~ 为 HOME
local expanded=$(echo "$path" | sed "s|^~|$HOME|")
echo "Original path: $path"
echo "Expanded: $expanded"
}大规模数据处理#
# 目录数据提取
find /path -type d | xargs -I {} sh -c 'cd {} && echo "$(pwd),$(ls -la | wc -l),$(du -sh | cut -f1)"' > directory_data.csv
# 目录结构可视化
tree -a $(pwd) > directory_structure.txt
# 目录层次分析
function analyze_directory() {
local path="$1"
local max_depth="$2"
if [ -z "$path" ]; then
path=$(pwd)
fi
if [ -z "$max_depth" ]; then
max_depth=3
fi
echo "Directory analysis for: $path"
echo "Max depth: $max_depth"
echo "=================================="
find "$path" -type d -maxdepth "$max_depth" | sort | xargs -I {} sh -c 'cd {} && echo "$(pwd | sed "s|$path||"),$(ls -la | wc -l),$(du -sh | cut -f1)"'
}
# 目录占用分析
function analyze_space() {
local path="$1"
if [ -z "$path" ]; then
path=$(pwd)
fi
echo "Space analysis for: $path"
echo "=================================="
du -h --max-depth=2 "$path" | sort -hr
}自动化工作流#
# 持续集成工作流
function ci_workflow() {
local repo="$1"
local branch="$2"
# 克隆仓库
git clone "$repo" /tmp/ci_repo
cd /tmp/ci_repo
# 切换分支
if [ -n "$branch" ]; then
git checkout "$branch"
fi
echo "CI Workflow"
echo "Repository: $repo"
echo "Branch: $(git branch --show-current)"
echo "Directory: $(pwd)"
echo "=================================="
# 安装依赖
npm install
# 构建项目
npm run build
# 运行测试
npm test
echo "=================================="
echo "CI Workflow completed"
}
# 数据科学工作流
function data_science_workflow() {
local dataset="$1"
# 切换到数据目录
cd "$HOME/Data/$dataset"
echo "Data Science Workflow"
echo "Dataset: $dataset"
echo "Directory: $(pwd)"
echo "=================================="
# 检查数据文件
ls -la
# 启动 Jupyter
jupyter notebook
echo "=================================="
echo "Data Science Workflow started"
}
# 系统部署工作流
function deploy_workflow() {
local app="$1"
local env="$2"
# 切换到应用目录
cd "$HOME/Apps/$app"
echo "Deployment Workflow"
echo "Application: $app"
echo "Environment: $env"
echo "Directory: $(pwd)"
echo "=================================="
# 拉取最新代码
git pull
# 构建应用
make build
# 部署应用
make deploy-$env
# 验证部署
make verify
echo "=================================="
echo "Deployment Workflow completed"
}性能调优#
# 监控 pwd 命令性能
time pwd
time pwd -P
time pwd -L
# 缓存目录路径
CACHED_PWD=$(pwd)
for i in {1..1000}; do
echo "$CACHED_PWD"
done
# 批量获取目录路径
ls -la ~/Projects | grep "^d" | awk '{print $9}' | xargs -I {} echo "~/Projects/{}"
# 减少系统调用
function fast_pwd() {
echo "$PWD"
}
# 并行目录路径获取
ls -la ~/Projects | grep "^d" | awk '{print $9}' | xargs -P 4 -I {} sh -c 'cd ~/Projects/{} && echo "$(pwd)"'高级应用场景#
# 容器管理
function docker_pwd() {
local container="$1"
# 获取容器内的工作目录
docker exec "$container" pwd
}
# 虚拟机管理
function vm_pwd() {
local vm="$1"
# 获取虚拟机内的工作目录
virsh domifaddr "$vm" | grep -oP '\d+\.\d+\.\d+\.\d+' | xargs -I {} ssh user@{} pwd
}
# 云服务管理
function cloud_pwd() {
local instance="$1"
# 获取云实例内的工作目录
aws ec2-instance-connect send-ssh-public-key --instance-id "$instance" --availability-zone us-east-1a --instance-os-user ec2-user --ssh-public-key file://~/.ssh/id_rsa.pub
ssh ec2-user@$(aws ec2 describe-instances --instance-ids "$instance" --query 'Reservations[0].Instances[0].PublicIpAddress' --output text) pwd
}
# 网络文件系统
function nfs_pwd() {
local mount_point="$1"
# 检查 NFS 挂载点
if mount | grep "$mount_point" | grep -q nfs; then
cd "$mount_point"
echo "NFS mount point: $(pwd)"
echo "Remote path: $(df -h "$mount_point" | tail -n 1 | awk '{print $1}')"
else
echo "Error: Not an NFS mount point: $mount_point"
fi
}最佳实践#
1. 使用场景#
- 显示当前工作目录
- 脚本编写和自动化
- 系统管理和维护
- 目录路径验证
- 与其他命令结合使用
2. 性能优化#
- 优先使用环境变量
$PWD代替多次调用pwd - 缓存目录路径减少系统调用
- 使用绝对路径避免多次目录查找
- 减少不必要的
pwd调用
3. 错误处理#
- 检查目录是否存在
- 处理权限问题
- 提供有意义的错误信息
- 使用 try-catch 模式
4. 脚本集成#
- 保存当前目录以便恢复
- 使用子shell避免影响当前目录
- 处理目录不存在的情况
- 添加日志和调试信息
5. 学习路径#
- 先掌握基本用法
- 学习与其他命令结合
- 掌握脚本集成
- 学习高级路径处理
- 最后学习自动化工作流
常见问题#
Q: 如何显示当前目录的物理路径?#
A: 使用 pwd -P 命令,它会显示不跟随符号链接的物理路径。
Q: 如何在脚本中保存当前目录?#
A: 使用 CURRENT_DIR=$(pwd) 来保存当前目录的绝对路径。
Q: 如何在符号链接目录中显示真实路径?#
A: 使用 pwd -P 命令,它会解析符号链接显示真实的物理路径。
Q: 如何结合其他命令使用 pwd?#
A: 可以使用命令替换,如 ls -la $(pwd) 来显示当前目录的内容。
Q: 如何在环境变量中使用 pwd?#
A: 可以将 pwd 的输出赋值给环境变量,如 export MY_DIR=$(pwd)。
相关命令#
cd- 切换目录ls- 列出目录内容mkdir- 创建目录rmdir- 删除空目录find- 查找目录和文件du- 查看目录大小df- 查看磁盘空间tree- 显示目录树结构realpath- 显示真实路径basename- 提取目录名dirname- 提取父目录