표준 입력 리디렉션을 사용하여 루프에서 대화형으로 파일 삭제

표준 입력 리디렉션을 사용하여 루프에서 대화형으로 파일 삭제

rm -i변수 $to_remove(한 줄에 하나의 경로) 에 저장된 파일을 대화형으로(예:) 삭제해야 합니다 . 불행히도 표준 입력이 리디렉션에 사용되기 때문에 내 코드가 작동하지 않습니다 <<< "$to_remove".

while read -r f ; do
    rm -ir "$f"
done <<< "$to_remove"

어떻게 해결할 수 있나요?

답변1

업데이트: 이것이 find데이터 소스인 경우 대신 배열을 사용하겠습니다.

readarray -t to_remove < <(find ...)
number_of_files=${#toremove[@]}
rm -i "${to_remove[@]}"

4 이전 버전을 사용하는 경우 bash이 루프를 사용하여 배열을 채웁니다.

while IFS= read -r fname; do
    to_remove+=("$fname")
done < <(find ...)

개행 문자가 포함된 파일에서는 이 중 어느 것도 작동하지 않지만 가능하면 이 경우를 무시하기가 더 쉽다고 생각합니다. 하지만 4에서는 bash다음 호출을 완전히 생략할 수 있습니다.find

shopt -s nullglob globstar
to_remove=( "$WORKING_PATH"/**/* )

나는 당신이 to_remove파일에서 그것을 채우고 있다고 가정합니다. 그렇게 하지 마십시오. 파일에서 직접 읽으십시오.

while IFS= read -r fname <&3; do
    rm -i "$fname"
done 3< file.txt

또한 표준 입력을 사용할 수 있도록 별도의 파일 설명자를 사용하여 파일에서 읽습니다 rm.

(정말 읽을 수 없다면 to_remove임시 파일을 사용하겠습니다.

printf "%s" "$to_remove" > tmp.txt
while IFS= read -r fname <&3; do
    rm -i "$fname"
done 3< tmp.txt
rm tmp.txt

)

답변2

나는 그것에 대해 생각했다.

IFS=$'\n'
for f in `echo "$to_remove"` ; do
    rm -ir "$f"
done

간결한 버전:

IFS=$'\n'
rm -ir "$to_remove"

두 버전 모두 예상대로 작동합니다.


이상하게도 아래 코드는 작동하지 않습니다.

IFS=$'\n'
for f in "$to_remove" ; do
    rm -ir "$f"
done

왜?

관련 정보