보호된 파일을 삭제할 때 "y"를 여러 번 발행할 필요가 없도록 하는 방법

보호된 파일을 삭제할 때 "y"를 여러 번 발행할 필요가 없도록 하는 방법

"rm: 쓰기 금지된 일반 파일 [x]를 제거하시겠습니까?"에 대한 답변을 찾고 있습니다.

bashrc에서 문자를 여러 번 내보내고 캐리지 리턴을 여러 번 내보내려고 합니다. 우리는 무엇을 해야 합니까?

답변1

업데이트된 질문을 기반으로 수정:

파일 삭제 여부를 묻는 메시지를 표시하지 않으려면 -f("force") 옵션을 추가하세요.

rm -f /path/to/file

여기에는 부작용이 있다는 점에 유의해야 합니다. 지정된 경로가 존재하지 않으면 해당 경로는아니요이를 보고하면 성공적으로 반환됩니다.

$ rm -f /nonexistent/path
$ echo $?
0

원래 답변:

간단한 해결책은 다음과 같습니다.

yes "$string" | head -n $number | tr $'\n' $'\r'

yes줄바꿈으로 구분하여 사용자가 제공한 문자열을 무한히 반복합니다. 여러 번 사용한 head후에 중지 $number하고 tr개행 문자를 캐리지 리턴으로 변환합니다. 캐리지 리턴으로 인해 출력이 표시되지 않을 수 있지만 이를 다음 명령( bash)에 전달하면 설명됩니다.

printf %q "$(yes "$string" | head -n $number | tr $'\n' $'\r')"

없는 사용자는 bash결과를 로 파이프 od하거나 반환된 실제 문자를 볼 수 있습니다 hexdump.xxd

답변2

rm질문하도록 하드코딩되어 있습니다.대화형으로쓰기 금지된 파일에 관해서. "대화형"은 질문을 인쇄한 다음 사용자 입력을 기다리는 것을 의미합니다.

묻는 것을 방지하는 방법에는 두 가지가 있습니다 rm.

rm -rf somedir
     ^

그리고

rm -r --interactive=never somedir
      ^^^^^^^^^^^^^^^^^^^

-r(둘 다 디렉토리 대신 파일을 삭제할 때도 작동합니다)

설명하다:

-frm"존재하지 않는 파일 및 매개변수를 무시하고 메시지를 표시하지 않음"을 활성화합니다 .

--interactive=never당신이 설교하는 것을 하십시오: 절대로 상호 작용하지 마십시오. 즉, 프롬프트를 표시하지 않습니다.

-f와 의 차이점은 --interactive=never"존재하지 않는 파일 및 인수 무시" 부분입니다.

비교하다:

$ rm -rf nonexistingname
$ echo $?
0

그리고

$ rm -r --interactive=never nonexistingname
rm: cannot remove 'nonexistingname': No such file or directory
$ echo $?
1

rm상호 작용을 원하지 않지만 여전히 오류를 처리하려는 스크립트를 작성할 때 차이점은 주로 흥미롭습니다.

요약 : 명령줄에서 사용됩니다 rm -rf.rm -r --interactive=never


보너스: 스크립팅 중이고 삭제하려는 파일 이름이 외부에서 온 경우, 이상한 파일 이름과 악의적인 입력을 방지하기 위해 위생 조치를 취해야 합니다.

rm -r --interactive=never -- "./$filename"

중요한 부분: --대시로 시작하는 파일 이름을 방지하려면 옵션 끝을 이중 대시( )로 표시하고, 파일 이름에 공백이 없도록 하려면 따옴표를 사용하고 ./파일 이름이 대시로 시작하는 것을 이중으로 방지하고 모든 파일을 강제 적용하려면 점 슬래시( )를 사용하십시오. 작업 디렉토리.

자세한 내용은 여기를 참조하세요.https://www.cyberciti.biz/faq/unix-linux-remove-strange-names-files/


명시된 질문("보호된 파일을 삭제할 때 "y"를 여러 번 실행하지 않는 방법")에 대한 답변은 다음을 참조하세요.https://askubuntu.com/questions/338857/automatically-enter-input-in-command-line/338860#338860

답변3

제가 가끔 겪는 또 다른 문제는 /etc/bashrc에 다음과 같은 rm별칭이 있다는 것입니다:rm -i

alias rm='rm -i'

이 경우 unalias rm별칭이 지정된 명령 앞에 백슬래시를 배치하여 별칭을 한 번 무시하기 위해 몇 년 전에 제가 발견한 이 트릭을 사용할 수도 있습니다. 예를 들면 다음과 같습니다.

\rm somefile

다음 문서에서 별칭에 대해 자세히 알아볼 수 있습니다.닉 크래프트.

답변4

나는 또한 같은 문제에 직면했습니다. 위의 답변은 하나의 파일에만 적용되지만 많은 파일을 무시하려면 예입니다.

당신은 그것을 사용할 수 있습니다

sudo rm -r /path/to/directory

쓰기 금지된 일반 파일 모두 삭제

관련 정보