뭔가 내가 확실히 알아야 할 기분이 : 나는 경우 ls <something>
, 것입니다 rm <something>
정확히 같은 파일 제거 ls
표시를? 표시되지 않은 rm
파일을 제거 할 수 있는 상황이 ls
있습니까? (이것은 18.04 bash에 있습니다)
편집 : 답변 한 모든 사람에게 감사합니다. 나는 정답이 모든 답의 조합이라고 생각합니다. 그래서 가장 많이 투표 된 답을 “답변”으로 받아 들였습니다.
내가 그 과정에서 배운 예기치 않은 것들 :
ls
논쟁을 다룰 때 생각하는 것만 큼 간단하지 않습니다.- 우분투 설치와 함께 간단한 비 바이올린, .bashrc 별칭
ls
- 명령 인수처럼 보일 수있는 대시로 시작하는 파일 이름을 지정하지 마십시오. 이름을 -r로 지정하는 것이 좋습니다!
답변
음, 모두 ls
와 rm
그들에게 전달되는 인자에서 작동합니다.
이러한 주장은 그래서 간단한 파일 일 수 있습니다 ls file.ext
와 rm file.ext
같은 파일에 작동하고 결과는 분명하다 (목록 파일 / 파일을 삭제).
대신 인수가 디렉토리 일 경우, ls directory
목록 의 콘텐츠 동안 디렉토리 rm directory
로 작동하지 않습니다이다 (즉, rm
당신이 경우에 동안 플래그없이이 디렉토리를 제거 할 수 없습니다 rm -r directory
, 그것은 반복적으로 삭제 된 모든 파일 에서 directory
와 디렉토리 자체 ).
그러나 명령 행 인수는 쉘 확장에 종속 될 수 있으므로 와일드 카드, 변수, 다른 명령의 출력 등이 포함 된 경우 동일한 인수가 두 명령 모두에 항상 전달되는 것은 아닙니다 .
극단적 인 예로 생각 ls $(rand).txt
하고 rm $(rand).txt
, 논쟁은 “동일”하지만 결과는 상당히 다릅니다!
답변
ls foo*.txt
vs 와 같은 것을 생각하고 있다면 rm foo*.txt
예, 동일한 파일을 표시하고 제거합니다. 쉘은 glob를 확장하여 해당 명령으로 전달하고 명령은 나열된 파일에서 작동합니다. 하나는 그들을 나열하고 하나는 제거합니다.
명백한 차이점은 해당 파일 중 하나가 디렉토리 인 경우 ls
해당 내용을 나열하지만 rm
제거하지 못하는 것입니다. 에 표시된 것보다 적은 것을 rm
제거 하므로 일반적으로 문제가되지 않습니다 .ls
여기서 큰 문제는 실행 중이 ls *
거나 대시로 시작rm *
하는 파일 이름이 포함 된 디렉토리에서 발생합니다 . 그들은 당신이 직접 그들을 쓴 것처럼 두 프로그램의 명령 줄에 확장 것이고, ls
걸릴 것이라고 -r
하면서, “역 정렬 순서”를 의미하는 rm
걸릴 -r
재귀 제거를 의미 할 수 있습니다. 하위 디렉토리가 두 레벨 이상인 경우 차이점이 중요합니다. ( ls *
첫 번째 레벨 디렉토리의 내용을 표시하지만 rm -r *
첫 번째 하위 레벨 이후의 모든 항목도 표시됩니다.)
이를 방지하기 위해 ./
현재 디렉토리를 나타내는 선행 글로 글로브를 작성 하거나 --
글로브 전에 옵션 처리의 끝 을 알리기 위해 (예 : rm ./*
또는 rm -- *
)를 넣으십시오 .
와 같은 glob를 사용하면 *.txt
점이 잘못된 옵션 문자이므로 실제로 문제가되지 않으며 오류가 발생합니다 (누군가가 유틸리티를 확장하여 의미를 발명 할 때까지). 그러나 ./
어쨌든 거기 에 두는 것이 더 안전 합니다.
물론 쉘의 글 로빙 옵션을 변경하거나 명령 사이에서 파일을 생성 / 이동 / 제거하면 두 명령에 대해 다른 결과를 얻을 수도 있지만 이러한 경우를 의심합니다. (신규 / 이동 한 파일을 처리하는 것은 안전하게 수행하기가 매우 어려울 수 있습니다.)
답변
쉘 동작을 제쳐두고, 자신 rm
과 ls
처리 할 수 있는 것에 만 초점을 맞 춥니 다 . 적어도 하나의 경우 ls
무엇을 보여줄 것이다 rm
특별한 디렉토리 – 제거 할 수 없습니다 디렉토리 권한 및 다른 관련 .
과를 ..
.
폴더 권한
rm
파일을 제거하면 디렉토리 내용이 변경되기 때문에 디렉토리에 대한 작업입니다 (즉, 디렉토리 항목 목록은 디렉토리 가 파일 이름 및 inode 목록에 불과하기 때문입니다 ). 즉, 디렉토리에 대한 쓰기 권한이 필요합니다. 파일 소유자 인 경우에도 디렉토리 권한이 없으면 파일을 제거 할 수 없습니다. 반대의 경우도 마찬가지입니다 : rm
당신이 디렉토리 소유자 인 경우, 다른 사람이 소유 할 수있는 파일을 제거 할 수 있습니다.
따라서 디렉토리에 대한 읽기 및 실행 권한이있을 수 있습니다. 예를 들어 ls /bin/echo
, 디렉토리를 순회하고 내용을 잘 볼 수는 있지만, 권한을 rm /bin/echo
소유 /bin
하거나로 권한을 부여 하지 않는 한 할 수 없습니다 sudo
.
그리고 당신은 어디에서나 이와 같은 경우를 볼 수 있습니다. https://superuser.com/a/331124/418028 와 같은 경우가 있습니다.
특수 디렉토리 ‘.’ 그리고 ‘..’
또 다른 특별한 경우는 .
및 ..
디렉토리입니다. 당신이 할 경우 ls .
또는 ls ..
, 그것은 행복하게 당신에게 내용을 보여 주지만 것이다 rm
그들이 허용되지 않습니다 보내고 ‘
$ rm -rf .
rm: refusing to remove '.' or '..' directory: skipping '.'
답변
입력 ls *
한 다음 표시된 rm *
것보다 많은 파일을 제거 할 수 있습니다. 파일 ls
의 끝 ls
과 시작 사이의 작은 시간 간격으로 생성되었을 수 있습니다 rm
.
답변
ls *
그리고 rm *
글로브를 확장 할 책임이 없습니다-이것은 명령으로 전달하기 전에 쉘에 의해 수행됩니다.
즉 , 확장 된 파일 목록과 함께 모든 명령을 사용할 수 있으므로 가능한 적은 작업을 사용합니다.
따라서이 작업을 수행하는 더 좋은 방법 (또는 적어도 다른 방법)은 중개인을 건너 뛰는 것입니다.
echo *
rm
명령에 전달 될 내용을 정확하게 보여줍니다 .
답변
어때요 :
$ mkdir what
$ cd what
$ mkdir -p huh/uhm ./-r
$ ls *
uhm
$ rm *
$ ls
-r
$ ls -R
.:
-r
./-r:
기본적으로 와일드 카드로 시작 물건에 확대 -
(또는 수동으로 입력 물건을 시작으로 -
좀 더 부정 행위처럼 보이지만 있음)에 의해 다르게 해석 될 수 ls
및 rm
.
답변
보여지는 것이 제거되는 것이 아닌 경우 가 있습니다 . 전달하는 인수가 디렉토리에 대한 심볼릭 링크 인 경우 다소 극단적이지만 운 좋게도 하나는 심볼릭 링크 된 디렉토리의 모든 파일을 표시 하고 심볼릭 링크는 제거하고 원래 디렉토리와 그 내용은 그대로 유지 한 상태입니다.ls
rm
ls
rm
% ln -s $HOME some_link
% ls some_link # Will display directory contents
bin lib Desktop ...
% rm some_link
% ls $HOME
bin lib Desktop ...