디렉토리의 모든 파일을 확인하고 사용자에게 csh 쉘에서 작업을 수행하도록 요청하는 방법

디렉토리의 모든 파일을 확인하고 사용자에게 csh 쉘에서 작업을 수행하도록 요청하는 방법

제가 이 스크립트로 하고 싶은 것은

  1. (기본 없이) 디렉터리에 있는 각 파일의 이름을 읽습니다.
  2. 각 파일에 대해 사용자에게 작업(예: 디렉터리에서 파일 이동)을 수행할지 묻습니다.
  3. 작업을 수행하거나 수행하지 않습니다.

    while 루프 및 입력 읽기에 문제가 있습니다. 나는 이것을 시도했습니다 :

    #! /bin/csh -f set DIR = 'pwd' find $DIR -name * -exec basename {} \ | while read filename do read -p $filename" (y 또는 n?)" 선택 if ($choice = " y") 다음 <> endif end

하지만 오류가 발생합니다.

find: `basename' terminated by signal 13.

또한 "예" 또는 "아니요"가 나올 때까지 사용자 입력을 확장하기 위해 일정 기간을 다시 사용하는 것을 고려하고 있지만 이는 2차 문제입니다.

답변1

bash-line 사양을 사용하더라도 #!쉘 코드의 일부는 code 처럼 보입니다 csh. 명령이 csh없으므로 오류가 발생합니다.readsignal 13

신호 13은 PIPE 신호로, 데드 파이프(아무도 반대쪽 끝에서 읽지 않는 파이프)에 쓰려고 할 때 프로세스로 전송됩니다. read루프 호출이 실패했기 때문에 파이프가 작동하지 않습니다 while. 에 있었기 때문에 실패했습니다 csh.

만약에 csh명령이 있는 경우 read루프는 파일 이름을 가져오지만 이를 알 수 있는 방법은 없습니다.어디이러한 파일 이름은 디렉터리 경로를 제거했기 때문에 해당 하위 디렉터리에 속합니다. 그러므로 당신은 그들로 많은 일을 할 수 없을 것입니다.


이것가장 단순한이를 수행하는 방법은 find사용자에게 질문하는 것입니다.

find . -type f -ok some-action '{}' ';'

some-action경로 이름을 인수로 사용하여 유틸리티를 실행하기 전에 각 경로 이름을 확인해야 합니다. 주어진 경로 이름에 대해 실행될 전체 명령줄을 요청하므로 정확히 원하는 것은 아닙니다.

또한 지정하면 -type f모든 일반 파일을 찾는 반면 -name '*'테스트에서는언제나디렉토리를 포함한 모든 유형의 파일에서 작동합니다. 또한 .(현재 디렉터리)를 최상위 디렉터리로 사용했는데 , 이는 변수를 사용하여 수행하려는 작업 find인 것 같습니다 .DIR

경로 이름을 올바르게 처리하면서 사용자에게 각 파일을 입력하도록 수동으로 요청하는 가장 쉬운 방법은 다음을 수행하는 것입니다.

find . -type f -exec sh -c '
    for pathname do
        printf "process %s (%s)?\n" "${pathname##*/}" "$pathname" >&2
        read answer
        case $answer in [Nn]*) continue; esac

        printf "processing %s...\n" "$pathname" >&2
        # process "$pathname" here
    done' sh {} +

이는 유사한 쉘을 가정 하고 에서 찾은 경로 이름 배치를 sh생성합니다 . 내부 쉘 스크립트는 사용자에게 각 개별 경로 이름을 처리할지 묻습니다. 사용자가 (대소문자 구분 안 함)로 시작하는 단어로 응답하면 다음 경로 이름이 고려됩니다.sh -cfindn

"${pathname##*/}"코드의 비트는 마지막 슬래시까지의 모든 항목을 제거하는 것과 같습니다 "$( basename "$pathname" )".$pathname

find명령은 다음과 같은 역할을 합니다.경로명 생성기for스크립트 내부의 -loop 의 경우 while경로 이름이나 파일 이름을 -loop로 파이프할 필요가 없습니다.

관련된:

관련 정보