목록에서 파일을 대화형으로 제거

목록에서 파일을 대화형으로 제거

파일 목록을 삭제하고 확인을 요청하고 싶습니다. 목록은 list.txt파일에 있습니다. 다음 명령이 제대로 작동하지 않는 이유는 무엇입니까?

while read i; do rm -i $i; done < list.txt

이전 명령은 나를 기다리지 않지만 다행히 파일이 삭제되지 않습니다.

나는 배쉬를 사용하고 있습니다.

답변1

rm -iwhile루프에서 상속된 표준 입력에서 답변을 읽습니다 . 따라서 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/

관련 정보