Linux下链接文件使用RM无法删除的解决办法

昝辉Zac Zac的SEO博客,坚持12年,优化成为生活。

在进行U-boot开发的时候,遇到一个小问题。网友wanglida79前几天刚遇到过,我当时没有模拟出来,现在自己倒是遇上了。不过我想出了解决的办法,只不过原因不明确,或许使用方法不对,或许有bug。

现象描述:进行U-boot移植的开发,为了patch方便,将源码的名字命名为.orig,这样以示区分。但是名字太长,在命令行下操作不太方便,所以想法就是建立软链接。

  1. [armlinux@lqmbootloader]$tree-L1
  2. .
  3. |--patch
  4. |--u-boot-1.1.3
  5. |--u-boot-1.2.0
  6. |--u-boot-1.2.0.orig
  7. |--vivi
  8. `--vivi_origin
  9. 6directories,0files

上面是目录下的主要文件夹,现在将源码链接为orig,将开发部分链接为develop。

  1. [armlinux@lqmbootloader]$ln-su-boot-1.2.0.orig/orig
  2. [armlinux@lqmbootloader]$ln-su-boot-1.2.0develop
  3. [armlinux@lqmbootloader]$ls
  4. developorigpatchu-boot-1.1.3u-boot-1.2.0u-boot-1.2.0.origvivivivi_origin

如上,现在想要删除develop和orig,出现意外情况:

  1. [armlinux@lqmbootloader]$rmdevelop/
  2. rm:cannotremove`develop/':Notadirectory
  3. [armlinux@lqmbootloader]$rm-fdevelop/
  4. rm:cannotremove`develop/':Notadirectory
  5. [armlinux@lqmbootloader]$unlinkdevelop/
  6. unlink:cannotunlink`develop/

看来删不掉,删除orig也同样如此,转念又实验了利用find来删除:

  1. [armlinux@lqmbootloader]$find.-typel|xargsrm-f
  2. [armlinux@lqmbootloader]$ls
  3. patchu-boot-1.1.3u-boot-1.2.0u-boot-1.2.0.origvivivivi_origin

看来能够成功。

现象分析与解决:上面提供的find and xargs的删除方法可以实现,但是只用rm为什么不能删除呢,我想应该是使用的方法上有问题,必须查阅rm和ln的用法,经过man查阅,ln的使用和rm的使用并没有问题,推翻了前面的想法,我想从rm直接删除和find删除的不同入手找到原因。

  1. [armlinux@lqmbootloader]$find.-typel
  2. ./develop
  3. ./orig

看来原因找到了,我在使用rm的时候总是习惯使用TAB键补全命令,但是TAB补全命令的时候,最后是以“/”结尾的,很明显的原因,rm也好,unlink也好,并不能很好的处理这种情况,这算是一处bug,我在前面写shell脚本来实现autozip时的时候,自己遇到过这个问题,采用了awk解决,原有的脚本如下:

  1. [armlinux@lqmbin]$catautozip
  2. #!/bin/bash
  3. #Copyright2007(c),ShandongUniversity
  4. #Allrightsreserved.
  5. #
  6. #Filename:autozip
  7. #Description:Compressfiles,andprint"OK"outifthefile
  8. #canbecompressedsuccessfully.
  9. #Syntax:autozip[filename|directoryname]
  10. #Author:LiuQingmin
  11. #Version:1.0
  12. #Date:07-04-29
  13. #
  14. #Func:get_target()
  15. #Desc:Obtainthenameoftargetfile
  16. #Para:$1--filenamethatwillbecompressed
  17. #Ret:TARGET--currentfilename
  18. get_target()
  19. {
  20. TARGET=`echo$1|
  21. awk-F/'{if($NF=="")print$(NF-1);
  22. elseprint$(NF)}'`
  23. }
  24. #HandleParameters
  25. if[$#!=1];then
  26. echo"Usage:`basename$0`"
  27. exit1
  28. fi
  29. #AssigntheparametertotheMacroOPT
  30. OPT=$1
  31. #Uncompressfiles
  32. if[-d$OPT];then
  33. get_target$OPT
  34. tarzcvf${TARGET}.tar.gz$OPT&&echo"OK"
  35. elif[-f$OPT];then
  36. get_target$OPT
  37. cp$OPTtmp
  38. gziptmp
  39. cptmp.gz${TARGET}.gz
  40. rmtmp.gz
  41. if[-x${TARGET}.gz];then
  42. chmod-x${TARGET}.gz
  43. fi
  44. echo"OK"
  45. fi

上面的get_target就是对这个情况的处理,不过没有想到rm也无法处理这种情况,要知道,使用TAB键提高效率是经常用的手段啊。

找到了bug,还没有看rm的源代码,倒是可以利用上面的脚本的思路来解决这个小bug,写了一个脚本rmlink,如下:

  1. [armlinux@lqmbin]$catrmlink
  2. #!/bin/sh
  3. #Copyright2007(c),ShandongUniversity
  4. #Allrightsreserved.
  5. #
  6. #Filename:rmlink
  7. #Description:solvethebugof"rm"and"unlink"
  8. #Syntax:rmlink<linkfilename>
  9. #Author:LiuQingmin
  10. #Version:1.0
  11. #Date:07-09-19
  12. #
  13. #Func:get_target()
  14. #Desc:Obtainthenameoftargetfile
  15. #Para:$1--filenamethatwillbecompressed
  16. #Ret:TARGET--currentfilename
  17. get_target()
  18. {
  19. TARGET=`echo$1|
  20. awk-F/'{if($NF=="")print$(NF-1);
  21. elseprint$(NF)}'`
  22. }
  23. #HandleParameters
  24. if[$#!=1];then
  25. echo"Usage:`basename$0`"
  26. exit1
  27. fi
  28. #AssigntheparametertotheMacroOPT
  29. OPT=$1
  30. #Uncompressfiles
  31. if[-d$OPT];then
  32. #eliminatethe"/"attheending
  33. get_target$OPT
  34. #youalsocanuse"unlink"insteadof"rm"
  35. rm${TARGET}
  36. fi
  37. #OK
  38. exit0
  39. //测试:
  40. [armlinux@lqmbootloader]$ls
  41. developorigpatchu-boot-1.1.3u-boot-1.2.0u-boot-1.2.0.origvivivivi_origin
  42. [armlinux@lqmbootloader]$rmlinkdevelop
  43. [armlinux@lqmbootloader]$rmlinkorig
  44. [armlinux@lqmbootloader]$ls
  45. patchu-boot-1.1.3u-boot-1.2.0u-boot-1.2.0.origvivivivi_origin

可见测试正常,rmlink可以正常使用,至此,问题最终解决。

附:vmware崩溃,导致关心查阅磁盘空间和文件大小,现在附几个常用的小命令,备查阅。

·查看文件的大小

[armlinux@lqm bootloader]$ ls -hl

·如果只想看到大小,而不希望看到其他信息,可以使用下面的命令:

[armlinux@lqm bootloader]$ ls -hl | awk '{print $5 "t" $NF}'

·查看单个目录占用空间的大小

[armlinux@lqm bootloader]$ du -hs u-boot-1.2.0

71M u-boot-1.2.0
相关广告
  • Linux下链接文件使用RM无法删除的解决办法 Linux下链接文件使用RM无法删除的解决办法 Linux下链接文件使用RM无法删除的解决办法
相关阅读

Linux下链接文件使用RM无法删除的解决办法

2019/10/10 17:48:27 | 谷歌SEO算法 | 小明SEO博客