이건 내 루프야
ls -ltrd * | head -n -3 | awk '{print $NF}' | while read y; do
rm -iR $y
done
산출:
rm: 디렉토리를 입력하시겠습니까
oct_temp17
? rm: 디렉토리를 입력하시겠습니까oct_temp18
? rm: 디렉토리를 입력하시겠습니까oct_temp19
? ....
사용자에게 확인 메시지를 표시하지 않으며 이상적으로는 수동으로 실행할 때 rm -i 를 수행해야 합니다.
Linux 3.10에서 bash 쉘을 사용하고 있습니다.
나는 유닉스/리눅스에 대해 매우 순진하다. ls 출력의 각 폴더를 확인하도록 스크립트에서 요청하는 방법을 제안해 주실 수 있나요?
답변1
1. 예제가 예상대로 작동하지 않는 이유
rm
프롬프트에서 피드백을 받으려면 STDIN이 필요합니다. 귀하의 예에서는 STDIN을 사용하여 목록을 while
루프로 파이프하므로 사용자가 아닌 // 명령에서 프롬프트에 대한 응답을 얻습니다 rm
.ls
head
awk
해결책은 STDIN을 사용하지 않고 루프에 목록을 제공하는 것입니다. 예를 들면 다음과 같습니다.
for y in $(ls -ltrd * | head -n -3 | awk '{print $NF}'); do
rm -iR $y
done
2. 더 안전한 접근 방식
awk
공백이 포함된 파일 이름을 준비하십시오( 파일 이름을 얻기 위해 ls
첫 번째 위치에만 파일 이름을 인쇄하도록 지시할 필요는 없습니다 ).
IFS=
for y in $(ls -1qtrd * | head -n -3); do
rm -iR "$y"
done
3. 더 간단한 방법
Archemar가 지적했듯이 (파일 이름에 공백이 없는 한) 루프도 필요하지 않습니다.
rm -iR $(ls -1qtrd * | head -n -3)