chmod를 대화식으로 만드는 한 줄 명령이 있습니까?


24

나는 다음과 같은 것을 찾고있다 :

ls | ask_yes_no_for_each_file | chmod +x the_files_approved

또는 유사한 구문.

개별 확인을 원하는 다른 명령에서도 작동 할 수 있습니다.

답변:


45

이것은 당신이 찾고있는 것을합니다 :

find . -maxdepth 1 -type f -print0 | xargs -L1 -p0 chmod +x

일반적으로 구문 분석 출력이 신뢰할 수 없기 때문에 find대신에 사용합니다 . 그러나이 형식 은 개행 문자 나 기타 어려운 문자가 포함되어 있어도 파일 이름과 함께 작동합니다.lslsfind

설명

  • find . -maxdepth 1 -type f -print0

    파일을 선택합니다. find의 많은 옵션 중 하나를 사용하여 사용자 정의 할 수 있습니다. 이 옵션 print0find파일 이름을 null로 구분 된 목록으로 인쇄하도록 지시 합니다. 이것은 파일 이름 목록을 전송하는 데 신뢰할 수있는 유일한 방법입니다.

  • xargs -L1 -p0 chmod +x

    널로 구분 된 파일 이름 목록이 생성되어 find명령이 적용됩니다.

-L1옵션은 xargs한 번에 하나의 파일 이름에서만 작동하도록 지시 합니다. 이 -p옵션은 xargs계속하기 전에 승인하라는 메시지를 표시합니다. 이 -0옵션은 xargs널 문자를 파일 이름 사이의 구분자로 사용하도록 지시 합니다.

[ @kwan이 지적 할 때까지 -p옵션을 xargs몰랐습니다.]


find를 사용하여 POSIX 명령을 호환 가능 하게 만들 수 있습니다 -exec printf '%s\0' {} +. POSIX 전체를 호환 가능하게 만드는 방법이 있다고 생각하지 마십시오.
l0b0

이 구문은 나에게 경고를 제공 find: warning: you have specified the -maxdepth option after a non-option argument -type, but options are not positional (-maxdepth affects tests specified before it as well as those specified after it). Please specify options before other arguments.가 작동 그래서 -maxdepth 1전과 -type f같이 : find . -maxdepth 1 -type f -print0 | xargs -L1 -p0 chmod +x.
Harvey

@Harvey 당신은 정확합니다 : 나는 그 경고를 제거하기 위해 답변을 업데이트했습니다.
John1024

25

사용할 수 있습니다 xargs.

예 :

ls|xargs -I path -p chmod +x path

옵션 -p: 각 명령 줄을 실행할지 여부를 사용자에게 묻고 터미널에서 줄을 읽습니다. 응답이 'y'또는 'Y'로 시작하는 경우에만 명령 행을 실행하십시오.


1
+1 나는 당신이 xargs -p너무 많이 사용하여 그것을 복사 할 것을 좋아합니다.
John1024

1
완전한! 대부분의 명령을 대화식으로 만드는 매우 간단한 방법입니다. 감사.
Harvey


@ Kroltan-왜 파일 이름에 개행을 사용합니까?
nbubis

1
@nbubis 발생할 수 있습니다 : 터미널로 이동하여 touch "a very long file name입력 한 후 Enter를 누르십시오. 줄 연속을보고 간단히 닫는 따옴표를 입력하고 Enter를 다시 누르십시오. tadaa, 파일 이름의 줄 바꿈. 긴 파일 이름을 다시 입력하는 게으름.
Kroltan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.