一、拷贝文件(包括隐藏文件)
1、cp命令 常用参数说明:
-r或-R 递归
-f 覆盖
-u 仅更新
-p 保留文件属性 (default:mode,ownership,timestamps), if possible additional attributes: context, links, xattr, all
-d或-P 保留符号链接
-a (--archive,归档的意思)相当于 -dpR 或者 -dR --preserve=all(-p和--preserve=all意思差不多)
2、拷贝目录下的所有文件(包括隐藏文件):
cp -a /src/. /dist/
参数说明:-r为递归拷贝,-f为强制覆盖已存在的文件。
3、连带外层目录一起拷贝(包括隐藏文件):
cp -a /demo/src /dist/
二、混合隐藏文件的处理(删除、剪切、拷贝)
1、问题分析( 想看结论的直接看3 )
Linux下面以 `.` 开头的文件为隐藏文件。另外,linux中还有两个特殊目录:`.` 和 `..`,有时候需要特殊处理。
所谓 “混合隐藏文件”,是指操作的文件中,可能既有隐藏文件又有非隐藏文件。
通常的场景为:
剪切(移动)一个目录下的所有内容或者部分内容(内容包括文件和目录,且文件中可能有隐藏文件)
拷贝、删除一个目录下的所有内容
拷贝、删除一个目录下的部分内容
特别注意:
若是针对 目录 和 非隐藏文件,则无需考虑隐藏文件问题。
举例来说,我要拷贝(删除、移动)某个目录下的几个非隐藏文件,则直呼其名就行了,示例如下:
cp -a src/aaa src/bbb src/*.doc /dist
另外,针对场景2,“拷贝、删除一个目录下的所有内容”,很容易实现:
拷贝目录下的所有:cp -a /src/. /target/
删除目录下的所有:rm -rf /src && mkdir -p /src
2、总体策略
方法一,使用通配符,分两批操作(隐藏文件一批,非隐藏文件一批)
例如:
rm -rf * .[^.]*
mv * .[^.]* /dist/
cp -a src/* src/.[^.]* /dist/
说明:第一个*匹配除了隐藏文件的所有文件,第二个参数 .[^.]* 匹配隐藏文件。
表达式 .[^.]* 的解释如下:
以.开头,加不是.的一个任意字符,再加其他任意字符(*)。
为什么不用 “.*” ? 因为 .* 会匹配 . 和 .. 这两个特殊目录。
注意,.[^.]*不是正真意义上的正则表达式,普通ls、rm、mv、cp等命令只支持通配符,不支持完整的正则表达式。
方法二(推荐):使用ls -A + 支持正则表达式的过滤命令(例如grep、sed或awk)。
ls -A 等价于:ls -a egrep -v "^\.$|^\.\.$" (即ls -a排除掉特殊目录`.`和`..`)
上面的几个例子,可以用下面的解法:
ls -A | xargs -i rm -rf {}
ls -A | xargs -i mv {} /dist/
ls -A /opt/src | xargs -i cp -a /opt/src/{} /dist/
注意 ls -A /opt/src打印出来的值是没有 /opt/src路径的,所以后面 cp等指令务必跟上路径。
3、总结
1)剪切(移动)一个目录下的所有内容
ls -A | xargs -i mv {} /dist/
ls -A /opt/src | xargs -i mv /opt/src/{} /dist/
2)剪切、拷贝、删除一个目录下的部分内容
ls -A /opt/src | egrep -v "^target" | xargs -i mv /opt/src/{} /dist/
4、延伸:
剪切、拷贝、删除的对象为“从一个目录的任意子目录中筛选出部分内容”,怎么办?
答案:先使用find、locate、whereis等命令查找到文件,得到全路径再做处理。例如:
rm -rf $(find /src/ -maxdepth 2 -mindepth 1 -name "*er") || true
mv -f $(find /src/ -maxdepth 2 -mindepth 1 -name "*er") /dist/ || true
或者:
find /src/ -maxdepth 2 -mindepth 1 -name "*er" | xargs -r rm -rf
find /src/ -maxdepth 2 -mindepth 1 -name "*er" | xargs -i -r mv -f {} /dist/ (推荐)
注意,使用find、locate等命令查找文件后,再做删除、移动时,有一个缺点,那就是目录不能为空,否则mv或rm就会报错。
解决方案1:xargs 加上 -r (--no-run-if-empty) 参数(注意 -r option is a GNU extension,使用时最好测试一下)
解决方案2:可能报错的命令后面跟上“ || true” 或者“ || :”,例如:
mv -f /src/* /dist/ || true
mv -f /src/* /dist/ || :
说明:true 或者 ‘:’ 都代表什么都不做,但返回success、状态码0(可以打印echo $?查看上一个指令的状态码)
$ type -a true true is a shell builtin true is /usr/bin/true true is /bin/true $ type -a : : is a shell builtin
扩展:排除某个(某些)文件
例如删除除app以外的其他文件(包括隐藏文件)
find /src/ -maxdepth 1 -mindepth 1 ! -name "app" | xargs -r rm -rf
推荐下面的写法(只排除ee和.cc两个文件):
ls -A | egrep -v "^\.$|^\.\.$|^ee$|^.cc$" | xargs -r rm -rf
简单命令
查看磁盘使用率
df -h
动态查看文件内容
tail -f FILE_NAME
删除文件使用实例:
rm -f /var/log/httpd/access.log
将会强制删除/var/log/httpd/access.log这个文件
删除文件夹实例:
rm -rf /var/log/httpd/access
将会删除/var/log/httpd/access目录以及其下所有文件、文件夹
使用这个rm -rf的时候一定要格外小心,linux没有回收站的
新建文件 或 文件夹
touch test.txt
mkdir -pv /opt/lib/jvm
-p代表递归创建文件夹 -v代表显示创建文件夹的过程
拷贝文件/文件夹
单个文件:cp -u -v lib/report.jar /tmp/report.jar
多个文件至一个目录: cp -u -v lib/*.jar /tmp
目录到目录:cp -rf /lib/plugins/. /tmp/plugins
统计文件行数
wc -lcw
例如: $ wc - lcw file1.log file2.log
34106 655146 17831207 file1.log
7 52 5445212 file2.log
每行对应行数、字数、字节数、文件名 如果命令行中没有文件名,则输出中不出现文件名。
相关问题
+ (点击以下标题显示正文内容)
Linux删除文件时报错Argument list too long
unable to execute /bin/rm: Argument list too long
+ (点击以下标题显示正文内容)
cp -r /lib/plugins/* /tmp/plugins 这个命令有两个问题
+ (点击以下标题显示正文内容)
删除文件时,排除文件、排除目录
+ (点击以下标题显示正文内容)
查看目录大小
+ (点击以下标题显示正文内容)
以尺寸大小排列文件和目录
+ (点击以下标题显示正文内容)
查看文件夹下面的文件个数:
+ (点击以下标题显示正文内容)
查找并替换文件里的字符串内容
+ (点击以下标题显示正文内容)
查找文件
+ (点击以下标题显示正文内容)
查看文件的指定行
+ (点击以下标题显示正文内容)
查找某目录下包含关键字内容的文件
vim字符串查找
直接输入 斜杠/ 然后输入查找的字符串
下一个,n是向前找,N是向后找
从linux上传文件到linux服务器的命令如下:
scp local_file remote_user@host:remote_folder
例如:
scp 下载/kafka_2.11-0.9.0.1.tgz kafka@172.16.1.170:/home/kafka
+ (点击以下标题显示正文内容)
tar命令