shell中mv&rm&cp使用
# mv/rm
# 命令参数
mv 命令(move 的缩写),既可以在不同的目录之间移动文件或目录,也可以对文件和目录进行重命名。该命令的基本格式如下:
mv 【选项】 源文件 目标文件;
选项:
- -f:强制覆盖,如果目标文件已经存在,则不询问,直接强制覆盖;
- -i:交互移动,如果目标文件已经存在,则询问用户是否覆盖(默认选项);
- -n:如果目标文件已经存在,则不会覆盖移动,而且不询问用户;
- -v:显示文件或目录的移动过程;
- -u:若目标文件已经存在,但两者相比,源文件更新,则会对目标文件进行升级;
- -b: 当目标文件或目录存在时,在执行覆盖前,会为其创建一个备份。
需要注意的是,同 rm 命令类似,mv 命令也是一个具有破坏性的命令,如果使用不当,很可能给系统带来灾难性的后果。
mv 参数设置与运行结果
命令格式 | 运行结果 |
---|---|
mv source_file(文件) dest_file(文件) | 将源文件名 source_file 改为目标文件名 dest_file |
mv source_file(文件) dest_directory(目录) | 将文件 source_file 移动到目标目录 dest_directory 中 |
mv source_directory(目录) dest_directory(目录) | 目录名 dest_directory 已存在,将 source_directory 移动到目录名 dest_directory 中;目录名 dest_directory 不存在则 source_directory 改名为目录名 dest_directory |
mv source_directory(目录) dest_file(文件) | 出错 |
# 强制覆盖
注意修改系统默认的参数;
unalias rm mv
mv -f dist.tar.gz mv -f AAWeb.tar.gz
1
# 处理隐藏文件重命名
在linux系统上有用;
mv /source/path/{.[!.],}* /destination/path
1
解释如下:
- mv命令的最后一个参数是要移动文件的目标位置;
- 第一个匹配除了隐藏文件的所有文件;
隐藏文件使用.
[^.]*
匹配; - 匹配隐藏文件用 .
[^.]*
为什么不用 .. 会匹配目录 . 和 .. .[^.]*
的意思是:以.开头,加不是.的一个任意字符,再加其他任意字符
或者
You could turn on dotglob
:
shopt -s dotglob # This would cause mv below to match hidden files
mv /path/subfolder/* /path/
1
2
2
In order to turn off dotglob
, you'd need to say:
shopt -u dotglob
1
次佳解决思路
在你的补充,你有错误,但代码仍然工作。唯一要补充的是,你告诉它只复制点文件。尝试:
mv src/* src/.* dst/
1
你仍然会得到错误。和..条目,这很好。但此举应成功。
~/scratch [andrew] $ mv from/* from/.* to/
mv: cannot move ‘from/.’ to ‘to/.’: Device or resource busy
mv: cannot remove ‘from/..’: Is a directory
~/scratch [andrew] $ ls -a from/ to/
from/:
. ..
to/:
. .. test .test
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
实践
拷贝node_modules备份;
cd $WORKSPACE
envName=develop # develop/release
moduleName=realtime #子模块名
modulePName=bdp-cloud-react #门户模块名
isNpmT=true # 是否使用npm淘宝源
isCacheDep=true # 是否缓存node_modules依赖包数据
isPull=false # 是否git pull模式;加快构建速度:目前要第一次成功后,才能用pull;如果对应的env中模块的版本修改后请下要改回false;
curDir=$WORKSPACE
bakDir=$curDir/node_modules_bak
bakPDir=$bakDir/$modulePName
bakMDir=$bakDir/$moduleName
bakPDirisEmpty=true
bakMDirisEmpty=true
npmSource=http://npm.iwhalecloud.com:8081/repository/npm-all/
if [ $isNpmT == true ]; then
npmSource=https://registry.npm.taobao.org/
fi
function checkFileEmpty() {
isEmptyFile=true
file=$1
if [ -e $file ]; then
if [ "$(ls -A ${file})" != "" ]; then
isEmptyFile=false
fi
else
mkdir -p $file
fi
echo $isEmptyFile
}
rm -rf dist dist.zip
cd ./node
npm install --registry=$npmSource
npm run git addUser xxx xx=
if [ $isPull != true ]; then
npm run clone env=$envName module=$moduleName
else
npm run clone env=$envName module=$moduleName pull=true
fi
if [ $isPull == true ]; then
cd ../.gittmp/$moduleName
npm run build env=$envName
else
if [ $isCacheDep == true ]; then
bakPDirisEmpty=$(checkFileEmpty $bakPDir)
bakMDirisEmpty=$(checkFileEmpty $bakMDir)
fi
cd ../.gittmp/$modulePName
if [ $isCacheDep == true -a $bakPDirisEmpty == false ]; then
rm -rf node_modules && mkdir node_modules && mv -v $bakPDir/{.[!.],}* ./node_modules
fi
npm install --registry=$npmSource
cd ../$moduleName
if [ $isCacheDep == true -a $bakMDirisEmpty == false ]; then
rm -rf node_modules && mkdir node_modules && mv -v $bakMDir/{.[!.],}* ./node_modules
fi
npm install --registry=$npmSource
npm run build env=$envName
if [ $isCacheDep == true ]; then
rm -rf $bakDir && mkdir -p $bakPDir $bakMDir
mv -vf ../$modulePName/node_modules/{.[!.],}* $bakPDir
mv -vf ./node_modules/{.[!.],}* $bakMDir
fi
fi
zip -r dist.zip dist
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# cp
# 命令参数
Linux cp(英文全拼:copy file)命令主要用于复制文件或目录。
# 语法
cp [options] source dest
1
或
cp [options] source... directory
1
参数说明:
- -a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于dpR参数组合。
- -d:复制时保留链接。这里所说的链接相当于 Windows 系统中的快捷方式。
- -f:覆盖已经存在的目标文件而不给出提示。
- -i:与 -f 选项相反,在覆盖目标文件之前给出提示,要求用户确认是否覆盖,回答 y 时目标文件将被覆盖。
- -p:除复制文件的内容外,还把修改时间和访问权限也复制到新文件中。
- -r:若给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件。
- -l:不复制文件,只是生成链接文件。
# cp强制拷贝失效问题
修改系统默认的alias中的cp -i
操作;直接设置unalias cp;
# 参考链接
- https://www.runoob.com/linux/linux-comm-mv.html
- https://www.runoob.com/linux/linux-comm-cp.html
- https://stackoverflow.com/questions/20192070/how-to-move-all-files-including-hidden-files-into-parent-directory-via
上次更新: 2022/04/15, 05:41:30