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
것입니다 .$prefix
find
쉘이 현재 디렉토리의 일치하는 이름으로 확장하지 않도록 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