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


13

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

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.

다른 방법이 있습니까?


6
이 작업을 수행하는 방법에 관계없이 원하는 파일을 디렉토리로 (안전하게) 이동 한 다음 삭제 될 파일 만 디렉토리에 있는지 확인한 후 디렉토리를 삭제하십시오.
user117529

여기서 안전이 중요합니다. 나는 일반적으로 이러한 것들을 ls먼저 테스트합니다 .
Scot

답변:


49

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

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

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


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

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

13

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

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


12

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

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

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

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

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

버전이 경우 seq-f/의 --format옵션이 대신 그것을 사용할 수 있습니다 해결 방법과 printf및 명령 대체.
David Foerster

난 그냥 질문에 사용되는 명령을 사용하여 자신의 RM 오류 설명하려고 대답했습니다, 감사
M4rty

9

내가 틀렸다면 누군가 나를 고치지 만, 시작하는 모든 파일 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의 배수 인 모든 것을 일치시키는 유사한 트릭은 없습니다.)


이것이 실제로 가장 좋은 대답입니다.
cesarv
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.