뭔가 느낌을 내가 알아야 할지 확실한 경우ls<뭔가를>
,이rm<무언가가 된다
제거 정확히 같은 파일에는ls
표시됩니까? 어떤 상황에서는rm
제거할 수 있는 파일을ls
보이지 않았? (이에 18.04bash)
편집:감사합니다 모든 사람에게 대답했습니다. 나는 생각한 전체 응답은 조합의 모든 답변,그래서 그가 받아들이 가장 선정으로 대답"응답".
예기치 않은 것을 배웠다.
-ls
은 간단하지 않으로 생각할 수 있습에서의 처리를 인수
-간단한 유엔 바이올린-으로 설치의 우분투,.bashrc 별명을ls
-Don't 는 이름의 파일로 시작하는 대로 그들이 같이 볼 수 있는 명령어 인수 및 한-r 묻는다.
만,모두ls
및rm
운영에서 인수로 전달되는습니다.
이러한 인수될 수 있는 간단한 파일에도ls 파일입니다.ext
과rm 파일입니다.ext
운영에서 같은 파일과 결과는 취소(목록에서 파일을 삭제/파일).
는 경우에는 대신 인 directory,ls 디렉토리 목록의 _content_ 의 디렉토리는
rm 디렉토리지't 업으로(즉,
rm없는 플래그를 제거할 수 없 디렉토리는 동안,당신이 할 경우
rm-r 디렉토리,그것을 재귀적으로 삭제합 _all files_ 에서
디렉토리에`고 디렉토리 자체).
그러나 유지하는 명령의 대상이 될 수 있습 shell expansion, 그래서 그's 지 always guaranteed 는 동일한 인수로 전달되는 두 명령 포함하는 경우 와일드카드,변수를 출력에서 다른 명령,etc.
로 극단적인 생각하는ls$(rand).txt
과rm$(rand).txt
인수를"동"그러나 결과는 아주 다르다!
당신이'다시 생각과 같은 ls foo.txtvs.
rm foo.txt`,그때 그렇다,그들이 보일 것이고 제거하는 같은 파일입니다. 쉘을 확장 글로브,그리고 그것을 전달하는 명령에서 질문하고 명령이 작동에 나열된 파일이 있습니다. 하나의 목록은 그들을 하나 제거 할 수 있습니다.
분명한 차이점은 어떤 경우 해당 파일의 일어난 디렉토리에 다음ls
이 목록의 내용하지만,rm
실패를 제거합니다. 는's 일반적으로하지 않기 때문에 문제rm
제거하는 것 less 보다 무엇에 의해 보ls
입니다.
장 큰 문제가 여기에에서 온실행ls*
또는rm*
디렉토리에를 포함파일 이름으로 시작. 그들이 확장하는 명령 라인의 두 가지 프로그램을 작성한 경우에는 그들 자신과ls
걸릴 것r
의미하는 것"reverse 정렬 순서"는 동안rm
걸릴 것r
의미하는 재귀 제거합니다. 의 차이를 사항이 있는 경우 하위 디렉터리에서 두 개 이상의 레벨이 깊다. (ls*
표시 내용의 첫 번째 디렉토리 수준이지만,rm-r*
이 과거의 모든 첫 번째 하위 레벨에 도움이 됩니다.)
을 방지하기 위해,쓰기 허용 방울과 주요./
을 나타내는 현재 디렉터리 및/또는--
의 끝을 신호 옵션을 처리하기 전에 시간을 낭비(즉,rm./*
또는rm--*
).
와 글로브처럼*.txt
,는's 제지 문제가 있기 때문에 점은 잘못된 옵션 캐릭터,오류가 발생합니다(때까지 확장 유틸리티를 발명하는 의미한다)하지만,그's 는 여전히 안전을 넣어./
을 즐기실 수 있습니다.
물론 당신은 또한 다른 결과를 얻을 위해 두 개의 명령을 변경한 경우 셸's 일러 옵션,또는 생성//제거 이동 파일에서 사을 명령하지만 난 당신을 의미 어떤 경우. (다루는 새로운/이동 파일 것을 매우 지저분하다.)
고객께 떠나 쉘 동작하자,'s 에 초점을 것만rm
과ls
다룰 수 있다. 적어도 하나의 경우ls
표시됩니다 무엇을rm
할 수 있'티 제거를 포함한 디렉토리 권한,그리고 다른 특별한 디렉토리.
and..
.
rm
가에서 작업 디렉토리기 때문에 제거하여 파일에 당신이'다시 변화하는 디렉토리 내용(또는 다른 말로 목록의 디렉토리 항목을,이후 ddit 아무것도 더 이상의 목록은 파일 이름 및 아이노드). 이것은 당신이해야에 쓰기 권한에 디렉토리에 있습니다. 는 경우에도 당신은 파일의 소유자지 않고,디렉토리 권한 있는't remove 파일이 있습니다. 기반대의 경우도 마찬가지입니다:rm
제거할 수 있는 파일을 소유할 수 있습니다,다른 사람에 의해 있는 경우 디렉토리의 소유자입니다.
그래서 당신은 아마도 아주 잘 읽기 및 실행에 대한 사용 권한 디렉토리할 수 있는 통과 디렉터리 내용을 보내에 그냥 좋은,예를 들면ls/bin/echo
,하지만 당신은 수'trm/bin/echo
지 않는 한 당신은 당신의 소유자/bin
또는 상승하는 권한을 가진sudo
.
고 당신이'll 경우 다음과 같이다. 여기's 하나 이러한 경우:https://superuser.com/a/331124/418028
또 다른 특별한 케이스.
and..
디렉터리입니다. 당신이 경우ls.
또는ls..
,그것은 즐겁게 당신을 보여 내용하지만,rm
'ing 하는 것은 허용되지 않습:
$ rm -rf .
rm: refusing to remove '.' or '..' directory: skipping '.'
가 are 경우 whatls
표시되지 않은 무엇이rm
제거합니다. 오히려 극단적인,하지만 다행히도 양성 한 경우에 인수를 통과하는 상징적인에 대한 링크를 디렉토리는ls
당신을 보여줍니다에 있는 모든 파일을 symlinked 디렉토리는rm
을 제거하는 심볼릭 링크를 떠나,원래 디렉토리와 그 내용을 훼손되지 않은:
% ln -s $HOME some_link
% ls some_link # Will display directory contents
bin lib Desktop ...
% rm some_link
% ls $HOME
bin lib Desktop ...
이미 많은 좋은 답이지만,추가하고 싶은 좀 더 깊은 통찰력.
자신에게 질문을 얼마나 많은 매개 변수가 전달되면ls
의 경우 쓰기
ls *
...? 참고 하는ls
command 을 얻을하지 않으로*
매개 변수는 경우는 파일이 있*
확장할 수 있습니다. 대신,셸을 먼저 수행일러 명령을 호출하기 전에,그래서ls
명령을 실제로 많은 매개 변수로 있는 파일과 일치하는 파일을 열 수 있습니다. 을 억제하일,견적 매개 변수입니다.
이것은 진실에 대한 어떤 명령:에코*
대echo'*'
.
가 스크립트,그것countparams.sh
효과를 테스트 할 수 있습니다. 그것은 당신이 얼마나 많은 매개 변수는 그것이 전달되고 목록니다.
#!/bin/bash
echo "This script was given $# parameters."
arr=( "$@" )
for ((i=0;i<$#;i++)); do
echo "Parameter $((i+1)): ${arr[$i]}"
done
그것을 실행 가능 및 실행./countparams.sh *
. 배터 출력!
Glob 이를 확장하고 동일한 방법은 두 번는 경우**디렉토리 내용이 동일에 두 개의 서로 다른 시간.
당신이 정말로 원하는 것을 확인하는 것을 제외하고는,rm-i*.txt
. 그것은 당신이 별도로 파일을 전(고)을 제거합니다.
이 안에 대하여 경쟁 조건:
ls*.txt
/새로운 파일을 만들/rm*.txt
기 때문에 당신이'다시 묻는 모든 파일에 동일한 프로그램에는's 을 제거합니다.
이것이 너무 복잡 정상적인 사용을 위해,당신은 별칭이rm
에서rm-i
,you'll 자신을 찾을 사용하여\rm
또는rm-f
상당히 많습니다. 그러나 그것은 가치가에서 적어도 언급하는 해결책이 있을 경쟁 상태입니다. (It's 도 휴대용 비 GNU 시스템:POSIXrm(1)
지정-i
옵션.)
또 다른 옵션은 것 bash 배열:to_remove=(*.txt)
,그 요청을 확인하기 위해 사용자(아마도 수행 한 후ls -ld -- "${to_remove[@]}"
)다음
rm--"${to_remove[@]}"
입니다. 그래서 glob 확장은 진행되고 목록을 전달되는 그대로를rm
.
다른 실질적으로 사용 가능한 옵션은 GNUrm-I
(남자 페이지)인지 묻는 메시지를 표시하는 경우 제 4 항목입니다. (그러나지 않는't 쇼 당신은 목록이다.) 내가 사용하는별칭 rm='rm-I'
습니다.
It's 좋을 보호하기 위해 지방 헤아리는 반환 반 입력한 패턴과 일치하는 너무 많. 그러나 사용하는ls
첫번째 일반적으로 좋은 디렉토리에서 당신의 자신의,또는 단일 사용자 시스템,그리고 때가 되't 백그라운드 프로세스할 수 있는 비동기적으로 새 파일을 만들 수 있다. 에 대비하고 지방 손가락,don't를 입력 rm-rf/foo/bar/baz
왼쪽에서 오른쪽.rm-rf/는
특별한 케이스하지만,rm-rf/usr
아't! 를 남길-rf
부분,또는 시작으로ls
,그리고만 추가rm-rf
후 부분을 입력합니다.