이름이 다음과 같은 파일이 포함된 디렉토리가 있습니다.
rho_0.txt
rho_5000.txt
rho_10000.txt
rho_150000.txt
rho_200000.txt
등. 5000의 배수인 모든 항목을 삭제하고 싶습니다.
나는 다음을 시도했지만 printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | rm
, 이것은 나에게 응답을 주었다 rm: missing operand
.
다른 방법이 있나요?
답변1
루프나 추가 명령이 필요하지 않습니다.Bash Shell Brace Expansion
.
rm -f rho_{0..200000..5000}.txt
설명하다: {start..end..step}
. -f
파일이 존재하지 않는다는 알림을 무시하십시오.
Ps 안전을 위해 어떤 파일이 삭제될지 확인하려면 먼저 테스트해 보세요.
ls -1 rho_{0..200000..5000}.txt
답변2
rm
표준 입력에서 읽지 마십시오. 다음을 수행할 수 있습니다.
for i in $(seq 5000 5000 25000); do
rm -i rho_${i}.txt
done
동작을 확인할 수 있도록 삭제하기 전에 메시지를 표시하는 -i
옵션을 제공했습니다. rm
원하는 대로 작동한다는 확신이 들면 이 옵션을 무시해도 됩니다.
편집: 또는 다음을 수행할 수 있습니다.
for ((i = 5000; i <= 25000; i += 5000)); do
rm -i rho_${i}.txt
done
프로그래밍을 해본 적이 있다면 이 형식이 더 익숙할 수 있습니다.
답변3
파이프의 내용이 매개변수인 것처럼 프로그램으로 파이프할 수 없습니다. 표준 입력을 통해 전송됩니다.
이 목적으로 xarg를 사용해야 합니다:
printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | xargs rm
하지만 먼저 echo를 사용하여 모든 것이 예상대로 진행되는지 확인할 수 있습니다.
printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | xargs echo
답변4
내가 틀렸다면 누군가 나를 정정해 주지만, 로 시작하는 모든 파일이 rho_
이 형식이라면 그것은 다음을 수행하는 것과 동일하지 않습니다.
rm rho_0.txt rho_*[05]000.txt
0이 아닌 숫자는 0000이나 5000으로 끝나는 경우에만 5000의 배수이기 때문입니다.
(0은 5000의 배수이기 때문에 특별한 경우이지만 일반적으로 앞에 0이 추가로 표시되지 않습니다. 0을 포함하지 않으려면 위 줄에서 제거하세요.)
물론 rho_*.txt
이 방법은 디렉터리의 모든 파일이 필수 형식을 갖고 있는 경우에만 사용해야 합니다. 디렉토리에도 rho_please_dont_delete_me_5000.txt
.
(수학 참고: 이는 5000의 모든 소인수, 즉 2와 5가 우리가 사용하는 밑수 10의 소인수이기 때문에 정확하게 작동합니다. 마찬가지로 10의 충분히 큰 거듭제곱(예: 10000)이 존재합니다. 5000까지. 3000의 모든 배수를 일치시키는 유사한 트릭은 없습니다.)