터미널에서 파일 이름을 기준으로 특정 파일 삭제

터미널에서 파일 이름을 기준으로 특정 파일 삭제

이름이 다음과 같은 파일이 포함된 디렉토리가 있습니다.

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의 모든 배수를 일치시키는 유사한 트릭은 없습니다.)

관련 정보