폴더와 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