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
왜?