文件管理

文件管理

linux 文件管理

工具

ag 'body'               # 文本搜索

dos2unix filename       # 格式转换
expand -t 4 filename    # 将 TAB 转换为 4 个空格

wc -l $(find . -type f -name '*java')   # 文件行数统计

查看

ls -l --time-style=long-iso             # 长时间格式

find


find . -type d -exec chmod 750 {} \;    # 按权限查找文件
find . -type f -exec chmod 640 {} \;
find . -type f -exec dos2unix {} \;

find . -size +50M                       # 查找大于 50M 的文件
find . -mtime +5                        # 查询修改时间大于 5 day
find . -name 't*' -exec basename {} \;  # 取文件名
find . -name *name1* -or -name *name2*  # 多个关键字

find . -name '*.log' -type f -exec rm {} \;


# 查找最大的 10 个文件
find . -type f -exec du {} \; | sort -nr | head | awk '{print $2}'

# 查找当前目录下的文件夹内的 *.gz 文件, 只查找一级
find . -maxdepth 2 -type f -name "*.gz"
find . -maxdepth 2 -type f -name "*.tar.gz" -exec rm {} \;

# 删除 mac 的隐藏属性文件
find . -type f -name '._*'  -exec rm {} \;


# 查询所有人可写的文件和目录
find / -type f \( -perm -2 -o -perm -20 \) -exec ls -lg {} \;
find / -type d \( -perm -2 -o -perm -20 \) -exec ls -lg {} \;

# 查询没有属主的文件
Find / -nouser -o -nogroup

# 删除指定用户相关的文件和目录
find / -type f -user postgres -exec rm -f {} \;
find / -type d -user postgres -exec rm -rf {} \;

综合搜索

locate      # 搜索文件, 带数据库的

# 取当前目录下最大的 10 个文件
du -m * | sort -nr | head

# 列出当前目录下的各目录大小
du --max-depth=1 -h
du -sh ./*
for i in $(ls);do du -sh $i; done

分割恢复文件

# 分割文件
split --bytes=50M --suffix-length=3 file_name.tar.gz file_
split -b 500M -a 5 6134624-node902.tar part_

# 恢复文件
cat file_* > file_name.tar.gz

# 分卷打包
tar czf - /path/to/dir | split -b 100M -d -a 3 - archive.tar.gz.
cat archive.tar.gz.* | tar xz -C /dest/path

归档文件

tar xf xxx.tar.gz -C /dir/urlA  # 解压到指定位置
tar -rvf 1.tar file             # 给 tar 追加文件

# 解压当前目录下的所有文件
for i in $(ls);do tar xf $i;done

# 并行 压缩解压
pigz -p 20 -3 -c node192.qcow2 > node192.qcow2.gz
unpigz -p 8 node192.qcow2.gz

远程文件

# 简单比对远程文件和本地文件的差异
diff docker/apt-cache/acng.conf <(ssh pve-1 'cat docker/apt-cache/acng.conf')

# 比对整个目录(递归, 统一格式)
diff -ruN local_dir <(ssh user@host 'tar -C /remote/path -cf - remote_dir | tar -xf - -C /dev/shm && echo /dev/shm/remote_dir')

# 比对+编辑
vimdiff  docker/apt-cache/acng.conf scp://pve-1//home/wait/docker/apt-cache/acng.conf

文件占用

# 查看占用某文件的进程
fuser - v filename
lsof filename

rsync


# 只比对差异
rsync -n /dir1/ /data/share/hddDisk3/sync/
rsync -avuP --dry-run 09_docker/ pve-1:/home/wait/docker/

# 快速同步-按大小差异
rsync -anvh --size-only --stats /dir1/ /dir2/

# 单向同步
rsync -avuP --delete /dir1/ /dir2/
rsync -avuP --delete /dir1/ /dir2/

# ssh 同步
rsync -avuP --delete user1@192.168.0.206:/data/ssd2/archive/ /home/wait/archive/

# ssh 带端口
rsync -P -e 'ssh -p 31001' user1@1.179.1.1:file1.tar /home/user1/file2.tar

# 限速
# 9.76MB/s
rsync -avuP --bwlimit=10240 sver1:/data/nodes/11448389-xxx-hub-rocksdb /home/user1/backup/

# 5.01MB/s
rsync -avuP --bwlimit=5120 sver1:/data/nodes/11448389-gea-hub-rocksdb /home/user1/backup/


# 大文件传输 - 先拆后传
tar cf 6134624-node902.tar ./node902
split -b 500M -a 5 6134624-node902.tar part_

rsync -avuP -e 'ssh -p 31001' user1@1.1.1.1:/data/pro/bk ./bk
cat part_* > ../6134624-node902.tar
md5sum 6134624-node902.tar

事件

# 将当前目录下全部 jsp 文件, 添加 backup 的后缀
for i in $(ls);
do
    [ ${i##*.} = "jsp" ] && mv $i $i.backup
done

删除特殊文件名的文件

删除特殊名字的文件, 避免 shell 解释不出来名字的情况, 如 ‘?]’ 这个名字

找到 inode 号 ls -li find /root -maxdepth 1 -inum 953075 -delete

或者

find /root -maxdepth 1 -inum 131237 -exec rm -i {} ;

shell 文本处理

sed

sed -n '100p'               # show 100 line

sed -i 's/$/\r/' req_body   # 将文件的换行符由 lf 修改为 crlf

sed -n '/^[^#]/p' file.conf                 # 显示非注释行, 非 # 开头
sed -n '/^[^#[:space:]]\{1,\}/p' file.txt   # 显示非注释行, 非 # + 空格 开头

sed -e '/^[ ]*#|^$/d'       # 删除以空格开头或#开头或者空行的行;

sed -i '1d' fiel1           # 删除第1行,   注意,大文件特别慢,会另外生成一个文件
sed -i '1,100d' fiel1       # 删除第1-100行


# 在文件头部插入一行
sed -i '1iexport LD_LIBRARY_PATH=$HOME/deploy/lib:$LD_LIBRARY_PATH' ~/.bashrc


# 过滤颜色字符串
sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
sed 's,\x1B\[[0-9;]*[a-zA-Z],,g'

# 去除文件内的颜色控制字符
sed -i -E 's/\x1B\[[0-9]+m//g' node100.log


# 替换 以me1 开头, 后面跟38个字母
sed -i -e 's/me1[[:alnum:]]\{38\}/me1_addr/g' 500w.log

grep

grep "18080\|28080"                     # 多条件-或
grep -E "word1|word2|word3" file.txt    # 多条件-或

egrep -v "xx|xx1|xx2"       # 排除多个关键字

grep -C 10 xxx file         # 查看关键字的前后10行
# -A  后面N行
# -B  前面N行
# -C  前后N行


# 查找当前目录下的部分文件中的包含关键字的文件
find ./ -type f -name "*.c" -o -name"*.h" | xargs grep "strings"

jq


# jq 转义
user2='{"@type":"/ethermint.crypto.v1.ethsecp256k1.PubKey","key":"A68XidNaWKkGL2YjO9OYXsVnnarMhXOsKko/KQp4Qo8C"}'
# 转换为友好的转义格式
echo $user2 | jq @json
# "{\"@type\":\"/ethermint.crypto.v1.ethsecp256k1.PubKey\",\"key\":\"A68XidNaWKkGL2YjO9OYXsVnnarMhXOsKko/KQp4Qo8C\"}"

vi

set paste       # 不自动缩进
最后更新于