파일이 많은 폴더가 있습니다.
폴더에서 다음 파일을 삭제하고 싶습니다.
ni_mayb17000.mol2
ni_mayb50000.mol2
ni_fda.mol2
ni_mayb2000.mol2
ni_mayb5000.mol2
ni_in_trials1000_2999.mol2
ni_in_trials1-999.mol2
ni_in_trials5000.mol2
ni_intrials8000.mol2
ni_intrialsfinal.mol2
ni_mayb13000.mol2
ni_mayb21000.mol2
ni_mayb45000.mol2
ni_mayb55000.mol2
ni_mayb25000.mol2
ni_mayb60000.mol2
ni_mayb30000.mol2
ni_mayb8000.mol2
ni_mayb35000.mol2
ni_mayb_f.mol2
ni_mayb40000.mol2
ni_world_not_fda.mol2
삭제해야 할 파일이 특정 패턴을 따르지 않아 와일드카드나 패턴을 사용할 수 없습니다. 또한 패턴을 사용하면 의도하지 않은 파일이 삭제될 위험이 있습니다. 삭제하려는 파일 이름을 정확히 알고 있으므로 필요한 파일을 목록으로 저장한 다음 루프를 사용하여 삭제할 계획입니다 for
.
for i in $list; do
rm $i -f;
done
어떻게 목록으로 저장한 다음 이 for
목록을 실행할 수 있나요?
답변1
사용법 문제 for i in $list
는 "공백이나 기타 특수 문자 때문에 쉘 스크립트가 멈추는 이유는 무엇입니까?" 그리고"bash/POSIX 쉘에서 변수를 인용하는 것을 잊어버리는 보안 위험".
name.list
현재 디렉터리의 파일을 참조하여 한 줄에 하나씩 파일 이름을 수동으로 컴파일한 파일 이름 목록을 가정합니다 .
while IFS= read -r name; do
rm -f "./$name"
done <name.list
이는 각 이름을 변수로 읽어 들여 name
변수 rm -f
의 값으로 호출합니다. 파일이 존재하지 않으면 (으로 인해) 오류가 출력되지 않습니다 -f
. $name
will의 값은 삭제가 현재 디렉터리에 미치는 영향을 제한하기 위해 ./
이전에 호출되었습니다.rm
파일 이름 목록을 반복하면서 일부 출력을 생성하는 약간 더 복잡한 변형입니다.
while IFS= read -r name; do
if [ -e "./$name" ]; then
printf 'Removing "%s"\n' "$name"
rm -f "./$name"
else
printf 'Did not find "%s"\n' "$name"
fi
done <name.list
또는 다음을 사용하십시오 xargs
.
xargs -t -I {} rm -f ./{} <name.list
rm -f
이렇게 하면 파일의 각 줄 내용이 기억됩니다 name.list
. 표시되는 "추적 모드" -t
옵션을 활성화합니다 .xargs
xargs
답변2
예를 들어 파일에 넣으면 filelist.txt
다음 루프를 시도해 볼 수 있습니다.
while IFS= read -r filename
do
rm "$filename"
done < filelist.txt
그러나 파일을 실제로 삭제하기 전에 반드시 테스트하십시오(예: rm "$filename"
로 대체 echo "Would now remove $filename"
).
답변3
만약 너라면삭제할 정확한 파일 이름을 알아두세요을 선택한 다음 직접 삭제하세요.
rm file1 file2 ...
그리고 다른 파일에 저장하고 쉘 루프를 사용하여 해당 파일을 다시 읽는 것을 건너뛰십시오. 그런 다음 해당 파일 이름을 삭제하고 싶을 수도 있습니다! 효율성은 취향의 문제이지만 rm file1 ...
하나의 명령일 뿐인 반면, 다른 방법은 여러 단계를 거쳐야 하며, 인용문이나 기타 쉘 트랩을 생략하면 사고가 쉽게 발생할 수 있습니다.