Linux shell常用的命令

 

查找可执行文件并删除

在 git 提交时候用这个删可执行文件比较方便

在当前目录下找权限为 rwxr-xr-x(755)的 norm file 执行删除即可

find . -perm 755 -type f -exec rm {} \;

但是这里要注意, 如果是具有可执行权限的 build.sh 之类的文件其实不应该被删除, 此时加上一个排除条件

find . -perm 755 -type f ! -name "*.sh" -exec rm {} \;

或者直接用-delete 代替 -exec rm {} \; 亦可.

mv 当前目录下的所有文件到当前目录下的空目录中

测试数据:

  for i in {1..10};do touch file_$i.txt;done
  mkdir -p d1/d2
  for i in {1..3};do touch d1/d1_file_$i.txt;done
  for i in {1..3};do touch d1/d2/d2_file_$i.txt;done
  mkdir target
  git init
  git add .

如果直接使用 mv * target 会报错, 虽然不影响结果, 但是git 的提交看着难受

如果使用 git mv * target, 会报错导致不会向下执行.

find . ! -name target ! -name .git -depth 1 -print0 | xargs -0 -I {} git mv {} target/

上面的命令在 MacOS 下测试通过, 感觉可以用 find 的 exec 来做, 但是MacOS 下的mv没有-t 选项, 导致exec 的+ 不能用, 下面试试 Linux 下

仅针对 mv 可用, git-mv 不行

find . -maxdepth 1 -mindepth 1 ! -name .git ! -name target -exec mv -t target/ {} +

最大深度保证 mv 仅在当前目录下执行, 最小深度保证不搜.

这里能用 exec 和+ 主要是因为 mv 有-t 参数指定了 target, 如果用 git mv就不行了, 因为没有-t.

所以还是老老实实 xargs:

find . -maxdepth 1 -mindepth 1 ! -name target ! -name .git -print0 | xargs -0 -I {} git mv {} target/

注意 MacOS 和 Linux 的一个区别, Mac 里面的 depth 指定一次即可

而且这里不能针对目录执行 git mv, 很奇怪…

$ git mv d1/ target/d1
fatal: not under version control, source=d1, destination=target/d1

但是 MacOS 下没有问题. 莫非是git 版本?MacOS 下 git 为 2.39, Linux 下为 2.40, 有关系吗?