파일 목록을 삭제하고 확인을 요청하고 싶습니다. 목록은 list.txt
파일에 있습니다. 다음 명령이 제대로 작동하지 않는 이유는 무엇입니까?
while read i; do rm -i $i; done < list.txt
이전 명령은 나를 기다리지 않지만 다행히 파일이 삭제되지 않습니다.
나는 배쉬를 사용하고 있습니다.
답변1
rm -i
while
루프에서 상속된 표준 입력에서 답변을 읽습니다 . 따라서 list.txt
"정말 삭제하시겠습니까?"에 대한 답변으로 다음의 한 줄의 텍스트가 사용됩니다. 질문. 이 문제를 해결하려면 두 개의 입력 소스를 분리해야 합니다. 가장 간단한 방법은 read
별도의 파일 설명자에서 입력을 얻는 것입니다.
while IFS= read <&3 -r i; do
rm -i -- "$i" # Quote the file name, not just to be safe,
# but because it's the right syntax.
done 3< list.txt
더 이상 while 루프에 대한 표준 입력(fd 0)을 리디렉션하지 않으므로 rm
필요에 따라 터미널에서 읽습니다.
또는 다음을 수행할 수 있습니다.
IFS=$'\n' # set field separator to newline
set -f # disable globbing upon command substitution
rm -i -- $(cat list.txt)
또는 GNU xargs를 사용하십시오.
xargs -rd '\n' --arg-file=list.txt rm -i --
답변2
iselect
각 파일에 예 또는 아니오로 대답하는 것보다 더 특이한 경우에는 ncurses 기반 대화형 선택을 사용할 수 있습니다 . 예를 들어
iselect -a -m < list.txt | xargs -d '\n' -r echo rm
또는 현재 디렉터리에서 파일 선택을 허용합니다.
find . -maxdepth 1 -type f | iselect -a -m | xargs -d '\n' -r echo rm
이는 스페이스 바를 눌러 파일을 선택하고 선택 취소할 수 있는 전체 화면(전체 터미널) ncurses 기반 목록을 표시합니다. ENTER를 눌러 선택 사항을 적용하거나(선택한 항목이 표준 출력에 인쇄됨) q
종료합니다(아무것도 표준 출력에 인쇄되지 않음). 도움이 필요하면 누르세요 h
.
참고하세요 echo rm
- 테스트 목적으로 이렇게 작성했습니다. rm
그것이 무엇을 하고 있는지 확실히 이해했다면, 그것을 다음으로 바꾸세요.
또한 xargs
여기서는 with가 \n
입력 구분 기호로 사용된다는 점에 유의하세요. 파일 이름에 개행 문자가 포함되어 있으면 작동하지 않습니다. 이 문제에 있어서도 iselect
제대로 작동하지 않습니다. 한 줄에 하나의 항목이 필요하며 불행하게도 iselect
입력 또는 출력을 null로 종료하는 옵션이 없습니다.
iselect
데비안, 우분투 및 기타 배포판용으로 패키지되어 있습니다. 홈페이지 위치는 다음과 같습니다.http://www.ossp.org/pkg/tool/iselect/