입력 파일에서 토큰을 읽어서 언급된 파일을 삭제하는 방법

입력 파일에서 토큰을 읽어서 언급된 파일을 삭제하는 방법

폴더와 File_Prefix가 포함된 구성을 사용하여 파일을 삭제하는 스크립트를 만들고 있습니다.

  • 이것이 구성 파일이 될 것입니다: config.txt

    /local/FolderA,App
    /local/FolderB,Log
    /local/FolderC,File
    
  • 이것은 내 스크립트입니다.

    file="local/config.txt"
    while IFS="," read -r folder prefix;
    do
        find %s -name %s* -type f -exec rm {} \ "$folder" "$prefix";
    done < "$file"
    

하지만 제대로 작동하지 않습니다. 문제 해결을 도와주실 수 있나요? 명령에서 값을 할당하는 데 문제가 있습니다 IFS.

답변1

구성 파일에 새 줄이나 쉼표가 포함된 필드가 포함되어 있지 않고 지정된 디렉터리에서 위의 파일 이름 접두사가 있는 모든 파일만 삭제한다고 가정하면(즉, 재귀적이지 않음):

#!/bin/sh

while IFS=, read -r directory prefix; do
    rm -- "$directory/$prefix"*
done <config.txt

이는 각 줄의 첫 번째 쉼표로 구분된 필드를 directory변수로 읽어들이고 나머지 줄을 prefix변수로 읽어들입니다. 그런 다음 이를 사용하여 파일을 삭제합니다. (바라보다"--"(이중 대시) 매개변수는 어디에 기록되어 있나요?관련 설명 --)

언급된 각 디렉터리 경로에서 반복적으로 삭제해야 하는 경우:

#!/bin/sh

while IFS=, read -r directory prefix; do
    find "$directory" -name "$prefix*" -exec rm {} +
done <config.txt

find재귀 검색 외에 둘의 차이점은 명령에서 와일드카드 패턴처럼 사용된다는 $prefix점 입니다.find

*with를 사용할 때 find쉘이 현재 디렉토리의 이름과 일치하도록 확장하지 않도록 인용 *해야 합니다 .인용되지 않음위의 첫 번째 루프에서 with를 사용하면 rm쉘은 이를 일치하는 모든 이름으로 확장합니다.

만약 너라면아니요재귀적으로 삭제를 수행하고 싶지만 생성된 패턴과 일치하는 파일이 너무 많아서 첫 번째 루프에서 "인수 목록이 너무 깁니다" 오류가 발생합니다. 그러면 추가 내부 루프를 수행해야 할 수도 있습니다.

#!/bin/sh

while IFS=, read -r directory prefix; do
    for pathname in "$directory/$prefix"*; do
        rm -- "$pathname"
    done
done <config.txt

또는 find최상위 검색 경로만 사용하세요.

#!/bin/sh

while IFS=, read -r directory prefix; do
    find "$directory" ! -path "$directory" -prune -name "$prefix*" -exec rm {} +
done <config.txt

답변2

xargs를 사용하여 config.txt 파일의 파일 경로를 명령줄의 sh 실행 파일에 전달합니다.

< config.txt xargs -rd'\n' sh -c '
for arg do
 find "${arg%,*}" \
    -name "${arg##*,}*" \
    -type f \
    -exec rm -f {} + ;
done
' xargs-sh

관련 정보