Linux 에서 링크 파일 을 RM 으로 삭제 할 수 없 는 해결 방법
24245 단어 Shell
[안내] U - boot 개발 을 하 다가 작은 문제 가 생 겼 어 요.네티즌 wanglida 79 는 며칠 전에 만 났 는데, 나 는 당시 에 시 뮬 레이 션 을 하지 못 했 는데, 지금 은 내 가 만 났 다.그러나 나 는 해결 방법 을 생각해 냈 다. 단지 원인 이 명확 하지 않 을 뿐, 사용 방법 이 틀 렸 을 수도 있 고, bug 가 있 을 수도 있다.현상 설명: 진행
U - boot 개발 을 하 다가 작은 문제 에 부 딪 혔 습 니 다.네티즌 wanglida 79 는 며칠 전에 만 났 는데, 나 는 당시 에 시 뮬 레이 션 을 하지 못 했 는데, 지금 은 내 가 만 났 다.그러나 나 는 해결 방법 을 생각해 냈 다. 단지 원인 이 명확 하지 않 을 뿐, 사용 방법 이 틀 렸 을 수도 있 고, bug 가 있 을 수도 있다.현상 설명: U - boot 이식 개발 을 진행 하고 패 치 의 편 의 를 위해 소스 코드 의 이름 을 '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
위 와 같다.개발 과 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 라 고 할 수 있 습 니 다.내 가 앞에서 셸 스 크 립 트 를 써 서 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
위의 gettarget 은 이 상황 에 대한 처리 입 니 다.하지만 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 <linkfile name>
# 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 "t" $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)
위의 디 스 플레이 에서 알 수 있 듯 이 - h 를 추가 하지 않 으 면 크기 는 바이트 로 표시 되 고 - h 를 추가 하면 뚜렷 한 K 나 M 으로 표시 하면 훨씬 명확 해진 다.
http://www.php100.com/html/program/linux/2013/0904/1639.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Shell alias 명령에 별칭을 설정하는 방법명령에 별명을 설정하면 명령의'작은 이름'으로 삼을 수 있지만, 이렇게 하는 것이 무슨 의미가 있습니까? 이때 별명이 작용할 수 있다.vim 명령의 별명을vi라고 정의하면 이후에 실행된vi 명령은 실제로vim 명령을...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.