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

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

Folder 및 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것입니다 .$prefixfind

쉘이 현재 디렉토리의 일치하는 이름으로 확장하지 않도록 with 를 사용할 때는 인용 *해야 합니다 .find*인용되지 않은위의 첫 번째 루프에서 와 함께 사용하면 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

관련 정보