当前位置:  技术问答>linux和unix

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

    来源: 互联网  发布时间:2016-04-02

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

在进行U-boot开发的时候,遇到一个小问题。网友wanglida79前几天刚遇到过,我当时没有模拟出来,现在自己倒是遇上了。不过我想出了解决的办法,只不过原因不明确,或许使用方法不对,或许有bug。   现象描述:
  我进行U-boot移植的开发,为了patch方便,将源码的名字命名为.orig,这样以示区分。但是名字太长,在命令行下操作不太方便,所以想法就是建立软链接。
  [ARMLinux@lqm bootloader]$ tree -L 1
.
|-- patch
|-- u-boot-1.1.3
|-- u-boot-1.2.0
|-- u-boot-1.2.0.orig
|-- vivi
`-- vivi_origin
6 directories, 0 files
  上面是目录下的主要文件夹。现在将源码链接为orig,将开发部分链接为develop。
  [ARMLinux@lqm bootloader]$ ln -s u-boot-1.2.0.orig/ orig
[ARMLinux@lqm bootloader]$ ln -s u-boot-1.2.0 develop
[ARMLinux@lqm bootloader]$ ls
develop orig patch u-boot-1.1.3 u-boot-1.2.0 u-boot-1.2.0.orig vivi vivi_origin
  如上。现在想要删除develop和orig。出现意外情况:
  [ARMLinux@lqm bootloader]$ rm develop/
rm: cannot remove `develop/': Not a directory
[ARMLinux@lqm bootloader]$ rm -f develop/
rm: cannot remove `develop/': Not a directory
[ARMLinux@lqm bootloader]$ unlink develop/
unlink: cannot unlink `develop/
  看来删不掉。删除orig也同样如此。转念又实验了利用find来删除:
  [ARMLinux@lqm bootloader]$ find . -type l | xargs rm -f
[ARMLinux@lqm bootloader]$ ls
patch u-boot-1.1.3 u-boot-1.2.0 u-boot-1.2.0.orig vivi vivi_origin

看来能够成功。
  现象分析与解决:
  上面提供的find and xargs的删除方法可以实现。但是只用rm为什么不能删除呢。我想应该是使用的方法上有问题,必须查阅rm和ln的用法。经过man查阅,ln的使用和rm的使用并没有问题。**了前面的想法,我想从rm直接删除和find删除的不同入手找到原因。
  [ARMLinux@lqm bootloader]$ find . -type l
./develop
./orig
  看来原因找到了。我在使用rm的时候总是习惯使用TAB键补全命令,但是TAB补全命令的时候,最后是以“/”结尾的。很明显的原因,rm也好,unlink也好,并不能很好的处理这种情况,这算是一处bug。我在前面写shell脚本来实现autozip时的时候,自己遇到过这个问题,采用了awk解决。原有的脚本如下:
  [ARMLinux@lqm bin]$ cat autozip
#!/bin/bash
# Copyright 2007 (c), Shandong University
# All rights reserved.
#
# Filename : autozip
# Description: Compress files, and print "OK" out if the file
# can be compressed successfully.
# Syntax : autozip [filename | directory name]
# Author : Liu Qingmin
# Version : 1.0
# Date : 07-04-29
#
# Func: get_target()
# Desc: Obtain the name of target file
# Para: $1 -- file name that will be compressed
# Ret : TARGET -- current file name
get_target()
{
    TARGET=`echo $1 |
        awk -F/ '{if ($NF == "") print $(NF-1);
             else print $(NF)}'`
}
# Handle Parameters
if [ $# != 1 ];then
    echo "Usage: `basename $0` "
    exit 1
fi
# Assign the parameter to the Macro OPT
OPT=$1
# Uncompress files
if [ -d $OPT ]; then
    get_target $OPT
    tar zcvf ${TARGET}.tar.gz $OPT && echo "OK"
elif [ -f $OPT ]; then
    get_target $OPT
    cp $OPT tmp
    gzip tmp
    cp tmp.gz ${TARGET}.gz
    rm tmp.gz
    if [ -x ${TARGET}.gz ]; then
        chmod -x ${TARGET}.gz
    fi
    echo "OK"
fi

上面的get_target就是对这个情况的处理。不过没有想到rm也无法处理这种情况,要知道,使用TAB键提高效率是经常用的手段啊。
  找到了bug,还没有看rm的源代码,倒是可以利用上面的脚本的思路来解决这个小bug。写了一个脚本rmlink,如下:
  [ARMLinux@lqm bin]$ cat rmlink
#!/bin/sh
# Copyright 2007 (c), Shandong University
# All rights reserved.
#
# Filename : rmlink
# Description : solve the bug of "rm" and "unlink"
# Syntax : rmlink 
# Author : Liu Qingmin
# Version : 1.0
# Date : 07-09-19
#
# Func: get_target()
# Desc: Obtain the name of target file
# Para: $1 -- file name that will be compressed
# Ret : TARGET -- current file name
get_target()
{
    TARGET=`echo $1 |
        awk -F/ '{if ($NF == "") print $(NF-1);
             else print $(NF)}'`
}
# Handle Parameters
if [ $# != 1 ];then
    echo "Usage: `basename $0` "
    exit 1
fi
# Assign the parameter to the Macro OPT
OPT=$1
# Uncompress files
if [ -d $OPT ]; then
    # eliminate the "/" at the ending
    get_target $OPT
    # you also can use "unlink" instead of "rm"
    rm ${TARGET}
fi
# OK
exit 0

  测试:
  [ARMLinux@lqm bootloader]$ ls
develop orig patch u-boot-1.1.3 u-boot-1.2.0 u-boot-1.2.0.orig vivi vivi_origin
[ARMLinux@lqm bootloader]$ rmlink develop
[ARMLinux@lqm bootloader]$ rmlink orig
[ARMLinux@lqm bootloader]$ ls
patch u-boot-1.1.3 u-boot-1.2.0 u-boot-1.2.0.orig vivi vivi_origin
  可见测试正常,rmlink可以正常使用。
  至此,问题最终解决。
  附:
  vmware崩溃,导致关心查阅磁盘空间和文件大小。现在附几个常用的小命令,备查阅。
  ·查看文件的大小
  [ARMLinux@lqm bootloader]$ ls -hl
  如果只想看到大小,而不希望看到其他信息,可以使用下面的命令:
  [ARMLinux@lqm bootloader]$ ls -hl | awk '{print $5 "  " $NF}'
  ·查看单个目录占用空间的大小
  [ARMLinux@lqm bootloader]$ du -hs u-boot-1.2.0
71M u-boot-1.2.0
  ·查看磁盘剩余空间的大小
  [ARMLinux@lqm bootloader]$ df -hl
  关于选项-h,在ls等等的命令中都有,具体的含义是一致的,如下:
  -h, --human-readable
       with -l, print sizes in human readable format (e.g., 1K 234M 2G)

|
楼主好人,有经验分享,顶!

    
 
 

您可能感兴趣的文章:

  • 请问:linux中的软件包安装后,怎么删除呀,直接删除吗?
  • linux 变量内容删除 中有关“最短数据删除”的意思
  • Linux 删除命令关于删除系统打不出的乱码文件名
  • 在linux下删除文件夹的时候总提示Device or resuource busy,请问有没有强行删除的办法?
  • 如何将LINUX的分区删除
  • 我装了WINDOWS和LINUX双系统,现在怎么把LINUX删除了?
  • 在linux在如何保护正在使用的文件不被删除
  • linux系统怎么删除????
  • linux下删除文件原理
  • LINUX 下如何实现删除文件进度条
  • 怎样删除LINUX
  • 怎么彻底删除GRUB啊?我是双系统WIN2000+LINUX,格了LINUX盘后,重启提示GRUB>
  • linux启动菜单怎么删除其中一个?
  • Linux下文件删除的问题
  • 请问怎样删除linux系统自带软件
  • Linux 中通过什么函数删除目录
  • 在双系统中怎样删除linux系统
  • linux 删除已输入的命令
  • linux自带软件包的删除问题
  • 请教高手如何在Linux下删除Apache?!
  • linux系统无法启动出错,键盘无法输入
  • 安装Linux7.3后,在Win2K中删掉Linux分区,导致无法正常启动(显示grub>;),且无法从光盘启动,该如何解决?请帮忙
  • windows 和linux双系统,重装windows后,无法启动linux?
  • 我系统安装了win2000,win98,linux,现在登录时只能进入win98和linux,无法进入win2000
  • 达人狂入:linux中木马,文件无法删除
  • linux 无法分逻辑盘
  • 华硕p5b无法安装linux?
  • LINUX系统无法识别到网卡
  • 无法设置路由器的情况下,远程连接linux电脑
  • 在Linux中复制文件如何自动跳过那些损坏的无法被复制的文件。
  • 晕倒!新买的机器无法安装linux!如何办?求救!
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux/centos安装nginx常见错误及解决办法
  • linux我刚接触,我装了linux后,却把用户名和口令忘了,还有办法进却吗
  • windows 和linux双系统,重装windows后,无法启动linux? iis7站长之家
  • linux下C有没有类似于windows的资源处理办法
  • 显示器(AXION)不支持LINUX图形界面,有没有解决办法
  • 有没有办法当按下机箱上的电源按钮后让linux正常关机?
  • 用linux看csdn的目录树乱码,还有下载很慢,有优化办法吗?
  • 笔记本用linux好费键盘啊!有好的解决办法吗?
  • 救命:在linux下有什么办法恢复刚刚删除的数据?
  • 有没有办法在win或linux系统下安装一个hp的unix的虚拟机?
  • linux下有办法擦除flash
  • 虚拟机-虚拟光驱的搭配,有安装LINUX成功的办法么?
  • 请教 Linux 手机 DIY 编程的办法及经验
  • 有没有办法在Windows下进行Linux开发?
  • 急救!!——忘记了linux登陆密码,有办法进去吗?
  • 求Linux中的文件夹复制到Windows中的办法
  • 在linux下有没办法使开发出来的库不能通过nm查看接口
  • 兄弟,有没有办法在windows下备分linux啊
  • 请问LINUX下有没有办法可以玩古墓丽影?
  • Linux系统下安装Oracle X11错误解决办法
  • Linux 编译内核之后 没办法选择内核版本
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3