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

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

实践

拷贝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

# 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
×