이름에 특정 문자열이 포함된 파일을 찾아 대화식으로 삭제하는 Bash 스크립트

이름에 특정 문자열이 포함된 파일을 찾아 대화식으로 삭제하는 Bash 스크립트

두 개의 매개변수를 사용하는 스크립트를 만들어야 합니다 bash. 하나는 파일 이름을 검색할 문자열이고 다음은 검색할 파일 경로입니다. 다음으로 일치하는 파일을 한 번에 하나씩 반복하여 인쇄한 다음 사용자에게 삭제할지 묻는 메시지를 표시해야 합니다.

예는 다음과 같습니다:

./scriptName.sh foo /path/to/directory/

/path/to/directory/foo.txt

Delete this? (y/n)

user input

/path/to/directory/foop.txt

Delete this? (y/n)

user input

etc...

나는 처음에 시도했다

find $2 -type f -name "*$1*" -print

그리고

find $2 -type f -name "*$1*" -delete

여기서 는 $1스크립트의 첫 번째 매개변수이고 는 두 번째 매개변수입니다.$2

이것은 발견된 각 파일을 개별적으로 나열하고 삭제하라는 메시지를 표시해야 한다는 것을 깨달을 때까지 작동했습니다. 이는 코드의 처음 두 줄이 일치하는 모든 파일을 한 번에 삭제했기 때문에 문제였습니다.

답변1

to를 사용하여 찾은 경로 이름을 -ok실행 하거나 toexecute를 사용할 수 있습니다 .rm-execrm -i

이는 각각의 간단한 예를 보여주며 $searchpath검색 경로는 다음 $pattern과 같다고 가정합니다.결정적인이름 패턴(예 "*$1*": ).

-ok: 을 사용하면 비슷한 -ok작업을 수행 하지만 지정된 유틸리티를 실행하기 전에 먼저 사용자 확인을 요청합니다. 이를 사용하여 발견된 각 경로 이름을 개별적으로 실행합니다.find-execrm

find "$searchpath" -type f -name "$pattern" -ok rm {} \;

사용 rm -i: rm파일을 삭제하기 전에 유틸리티 자체에서 확인을 요청합니다. 대량 경로 이름에 이것을 사용할 수 있습니다.

find "$searchpath" -type f -name "$pattern" -exec rm -i {} +

물론 자신만의 프롬프트를 구현할 수도 있습니다. 다음은 bash단일 파일 삭제를 요청하는 스크립트 입니다 "$pathname".

read -p "Delete the file at $pathname? y/[n]: "
[[ "$REPLY" == [yY]* ]] && rm "$pathname"

find대량 경로 이름에 대해 이 메소드를 호출하십시오.

find "$searchpath" -type f -name "$pattern" -exec bash -c '
    for pathname do
        read -p "Delete the file at $pathname? y/[n]: "
        [[ "$REPLY" == [yY]* ]] && rm "$pathname"
    done' bash {} +

사용자가 대문자 또는 소문자로 시작하는 문자열로 응답하면 y파일이 삭제됩니다.

관련된:

답변2

pattern=$1
dir=$2

for file in $(find ${dir} -type f -name "*${pattern}*")
do
  /bin/rm -i ${file}
done

기본적으로 명령에 의해 반환된 파일을 반복하고 find있으며 rm -i명령은 y/n파일을 삭제할지 여부를 묻습니다. 이것이 당신이 찾고 있는 것이라고 생각합니다. 그러나 그렇지 않다면, 추가 도움이 필요한 것이 무엇인지 사람들에게 알려주십시오.

관련 정보