rm이 제거 할 파일을 항상 나열합니까? : 나는 경우 ls

뭔가 내가 확실히 알아야 할 기분이 : 나는 경우 ls <something>, 것입니다 rm <something>정확히 같은 파일 제거 ls표시를? 표시되지 않은 rm파일을 제거 할 수 있는 상황이 ls있습니까? (이것은 18.04 bash에 있습니다)

편집 : 답변 한 모든 사람에게 감사합니다. 나는 정답이 모든 답의 조합이라고 생각합니다. 그래서 가장 많이 투표 된 답을 “답변”으로 받아 들였습니다.

내가 그 과정에서 배운 예기치 않은 것들 :

  • ls 논쟁을 다룰 때 생각하는 것만 큼 간단하지 않습니다.
  • 우분투 설치와 함께 간단한 비 바이올린, .bashrc 별칭 ls
  • 명령 인수처럼 보일 수있는 대시로 시작하는 파일 이름을 지정하지 마십시오. 이름을 -r로 지정하는 것이 좋습니다!


답변

음, 모두 lsrm그들에게 전달되는 인자에서 작동합니다.

이러한 주장은 그래서 간단한 파일 일 수 있습니다 ls file.extrm file.ext같은 파일에 작동하고 결과는 분명하다 (목록 파일 / 파일을 삭제).

대신 인수가 디렉토리 일 경우, ls directory목록 의 콘텐츠 동안 디렉토리 rm directory로 작동하지 않습니다이다 (즉, rm당신이 경우에 동안 플래그없이이 디렉토리를 제거 할 수 없습니다 rm -r directory, 그것은 반복적으로 삭제 된 모든 파일 에서 directory 와 디렉토리 자체 ).

그러나 명령 행 인수는 쉘 확장에 종속 될 수 있으므로 와일드 카드, 변수, 다른 명령의 출력 등이 포함 된 경우 동일한 인수가 두 명령 모두에 항상 전달되는 것은 아닙니다 .

극단적 인 예로 생각 ls $(rand).txt하고 rm $(rand).txt, 논쟁은 “동일”하지만 결과는 상당히 다릅니다!


답변

ls foo*.txtvs 와 같은 것을 생각하고 있다면 rm foo*.txt예, 동일한 파일을 표시하고 제거합니다. 쉘은 glob를 확장하여 해당 명령으로 전달하고 명령은 나열된 파일에서 작동합니다. 하나는 그들을 나열하고 하나는 제거합니다.

명백한 차이점은 해당 파일 중 하나가 디렉토리 인 경우 ls해당 내용을 나열하지만 rm제거하지 못하는 것입니다. 에 표시된 것보다 적은 것을 rm제거 하므로 일반적으로 문제가되지 않습니다 .ls

여기서 큰 문제는 실행 중이 ls *거나 대시로 시작rm * 하는 파일 이름이 포함 된 디렉토리에서 발생합니다 . 그들은 당신이 직접 그들을 쓴 것처럼 두 프로그램의 명령 줄에 확장 것이고, ls걸릴 것이라고 -r하면서, “역 정렬 순서”를 의미하는 rm걸릴 -r재귀 제거를 의미 할 수 있습니다. 하위 디렉토리가 두 레벨 이상인 경우 차이점이 중요합니다. ( ls *첫 번째 레벨 디렉토리의 내용을 표시하지만 rm -r *첫 번째 하위 레벨 이후의 모든 항목도 표시됩니다.)

이를 방지하기 위해 ./현재 디렉토리를 나타내는 선행 글로 글로브를 작성 하거나 --글로브 전에 옵션 처리의 끝 을 알리기 위해 (예 : rm ./*또는 rm -- *)를 넣으십시오 .

와 같은 glob를 사용하면 *.txt점이 잘못된 옵션 문자이므로 실제로 문제가되지 않으며 오류가 발생합니다 (누군가가 유틸리티를 확장하여 의미를 발명 할 때까지). 그러나 ./어쨌든 거기 에 두는 것이 더 안전 합니다.


물론 쉘의 글 로빙 옵션을 변경하거나 명령 사이에서 파일을 생성 / 이동 / 제거하면 두 명령에 대해 다른 결과를 얻을 수도 있지만 이러한 경우를 의심합니다. (신규 / 이동 한 파일을 처리하는 것은 안전하게 수행하기가 매우 어려울 수 있습니다.)


답변

쉘 동작을 제쳐두고, 자신 rmls처리 할 수 있는 것에 만 초점을 맞 춥니 다 . 적어도 하나의 경우 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:

기본적으로 와일드 카드로 시작 물건에 확대 -(또는 수동으로 입력 물건을 시작으로 -좀 더 부정 행위처럼 보이지만 있음)에 의해 다르게 해석 될 수 lsrm.


답변

보여지는 것이 제거되는 것이 아닌 경우 가 있습니다 . 전달하는 인수가 디렉토리에 대한 심볼릭 링크 인 경우 다소 극단적이지만 운 좋게도 하나는 심볼릭 링크 된 디렉토리의 모든 파일을 표시 하고 심볼릭 링크는 제거하고 원래 디렉토리와 그 내용은 그대로 유지 한 상태입니다.lsrmlsrm

% ln -s $HOME some_link
% ls some_link    # Will display directory contents  
bin    lib    Desktop ...
% rm some_link
% ls $HOME
bin    lib    Desktop ...