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

이름이있는 파일이 들어있는 디렉토리가 있습니다

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.

다른 방법이 있습니까?



답변

루프 나 추가 명령이 필요하지 않습니다 Bash Shell Brace Expansion.

rm -f rho_{0..200000..5000}.txt

설명 : {start..end..step}. 는 -f존재하지 않는 파일에 대한 프롬프트를 무시합니다.


추신 안전을 유지하고 삭제할 파일을 확인하려면 다음을 먼저 테스트하십시오.

ls -1 rho_{0..200000..5000}.txt


답변

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

프로그래밍을 한 경우이 양식이 더 익숙 할 수 있습니다.


답변

파이프의 내용이 인수 인 것처럼 프로그램에 파이프 할 수 없습니다. stdin을 통해 전송됩니다.

이 목적으로 xarg를 사용해야합니다.

printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | xargs rm

그러나 먼저 에코로 시도하여 모든 것이 의도 한 것인지 확인할 수 있습니다.

printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | xargs echo


답변

내가 틀렸다면 누군가 나를 고치지 만, 시작하는 모든 파일 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.

(Math note : 이것은 5000의 모든 주요 요소, 즉 2와 5가 우리가 작업하고있는 기초의 주요 요소이기 때문에 정확하게 작동합니다. 마찬가지로 10의 충분한 거듭 제곱 (즉, 10000)이 있습니다. 3000의 배수 인 모든 것을 일치시키는 유사한 트릭은 없습니다.)


답변