디렉토리에서 여러 파일을 동시에 이름을 바꾸는 방법


12

디렉토리에 /var/tmp/abc4 개의 파일이 있다고 말합니다 .

12345-ram-3e3r5-io9490-89adu9.csv
45434-dam-qwe35-to9490-43adu9.csv
11234-cam-yy3r5-ro9490-85adu9.csv
14423-sam-hh3r5-uo9490-869du9.csv

가능한 한 가장 짧은 (아마도 한 줄짜리) 방식으로 모든 CSV 파일의 이름을 바꾸고 싶습니다 (모든 파일을 찾아서 이름을 바꿉니다).

XXXXX-ram-3e3r5-io9490-89adu9.csv
XXXXX-dam-qwe35-to9490-43adu9.csv
XXXXX-cam-yy3r5-ro9490-85adu9.csv
XXXXX-sam-hh3r5-uo9490-869du9.csv

답변:


15

rename -n 's/(\w+)/XXXXX/' *.csv

-n때 행복을 제거하십시오 .


2
의 적합한 버전 rename. 나는 이것이 래리 벽의를 가정 rename으로부터, rename(그리고 IIRC 데비안과 파생 상품의 패키지 prename레드햇 설득의 시스템에서). 매우 유용한 도구입니다.
xenoid

2
perl-rename아치 리눅스에서
lesmana

1
@ SHawarden, 나는 명령을 실행하려고 시도하고 교체 패턴을 이해하기 위해 매뉴얼 페이지의 관련 부분을 읽었지만 verbose플래그를 추가 할 때 아무것도 출력하지 않으며 현재 경로가 있지만 파일 이름 변경을 수행하지 않습니다. 이름이 비슷한 파일 12345_foo.csv. 작동하려면 추가 작업을 수행해야합니까 (현재 Fedora 30에서)? 루핑보다 깔끔한 접근 방식입니다. 미리 감사드립니다!
danieldeveloper001

3
@ danieldeveloper001 당신이 사용 했 renameprename? 위의 내 의견을 참조하십시오. man {the command}끝에 저자를 나열합니다.
xenoid

2
이것은 데비안에서 파생 된 시스템에서만 작동합니다. 페도라 파생 시스템은 완전히 다른 rename명령을 가지고 있습니다. 참조 unix.stackexchange.com/a/238862/135943
와일드 카드

11

시험:

for f in *.csv; do mv -i -- "$f" "XXXXX-${f#*-}"; done

작동 방식 :

  • for f in *.csv; do

    모든 *.csv파일에 대해 루프를 시작 합니다.

  • mv -i -- "$f" "XXXXX-${f#*-}"

    파일을 덮어 쓰기 전에 대화식으로 요청하여 원하는대로 파일 이름을 바꿉니다.

  • done

    이것은 루프의 끝을 나타냅니다.

예:

$ ls -1
11234-cam-yy3r5-ro9490-85adu9.csv
12345-ram-3e3r5-io9490-89adu9.csv
14423-sam-hh3r5-uo9490-869du9.csv
45434-dam-qwe35-to9490-43adu9.csv
$ for f in *.csv; do mv -i -- "$f" "XXXXX-${f#*-}"; done
$ ls -1
XXXXX-cam-yy3r5-ro9490-85adu9.csv
XXXXX-dam-qwe35-to9490-43adu9.csv
XXXXX-ram-3e3r5-io9490-89adu9.csv
XXXXX-sam-hh3r5-uo9490-869du9.csv

4

나는 당신이 게시 한 작은 도전을 좋아했기 때문에 여기 내 해결책이 있습니다. 모든 파일이 5 자리 숫자로 시작한다고 가정하고 cut 명령 을 사용 하여 초기 숫자 파일을 "XXXXX"로 바꿉니다.

아래는 명령 이전의 파일입니다.

-rw-rw-r--. 1 daniel daniel 0 May 13 23:18 11111_bar_file.csv
-rw-rw-r--. 1 daniel daniel 0 May 13 22:54 12345_baz_file.csv
-rw-rw-r--. 1 daniel daniel 0 May 13 22:54 67890_foo_file.xml

아래는 하나의 라이너 명령입니다.

for src in *.csv; do dst=XXXXX$(echo $src| cut -c6-); mv $src $dst; done;

아래는 명령 후의 파일입니다.

-rw-rw-r--. 1 daniel daniel 0 May 13 22:54 67890_foo_file.xml
-rw-rw-r--. 1 daniel daniel 0 May 13 22:54 XXXXX_bar_file.csv
-rw-rw-r--. 1 daniel daniel 0 May 13 23:18 XXXXX_baz_file.csv

찾고 계십니까? :)

참고 문헌 :

bash에서 명령 출력을 통해 반복

bash의 부분 문자열


2
Bash는 이러한 종류의 문자열 조작을 수행 할 수 있으며 각각에 대해 새로운 프로세스를 포크 할 필요가 없습니다 . 방법에 대한 다른 답변 을 참조하십시오 .
chx 2016 년

1
@chx는 이미 다른 답변을 보았고 약간의 지식을 얻었지만 지적 해 주셔서 감사합니다. 좀 더 자세히 설명해 주시겠습니까 no need to fork a new process for each?
danieldeveloper001

3
cut별도의 바이너리 ( /usr/bin/cut)이며 실행하면 셸 내장 기능을 사용하는 것보다 더 많은 리소스를 소비합니다.
chx

2
의도가 많은 파일의 이름을 바꾸는 것이 실제로 중요하다는 것을 알았습니다. 명확하게 해 주셔서 감사합니다!
danieldeveloper001

1

포크 없음 :

ls | perl -lne '$suf=substr($_,6); rename $_, "XXXXX-$suf"'

쉘 루프를 사용하면 mv파일 당 한 번 분기됩니다. 펄의 rename명령은 그렇지 않습니다.

Perl의 rename 명령에는 몇 가지 제한 사항이 있지만이 경우 이러한 제한 사항이 적용되지 않습니다.

앞에서 rename보여준 명령에 관해서는 그렇습니다.하지만 두 가지 다른 이름 바꾸기 등의 혼란이 있습니다. 당신이 옳은 것을 가지고 있다면 훌륭하지만 그렇지 않으면 이것도 효과가 있습니다.

perl-rename 명령이없고 설치할 수없는 경우 다음을 수행하십시오.

ls | perl -lne '$old=$_; s/(\w+)/XXXXX/; rename $old, $_'

보시다시피, 이것은 최상위 답변에 표시된 것과 동일한 대체를 사용합니다. 물론 펄 이름 바꾸기는 다른 종과 경적을 (상단의 대답은 언급이 -n이미하고있다 -0, -f등), 그리고 더 그들 중 당신이 필요로하는, 더 당신은이 방법으로 자신이 설치 대신 압연한다 .


파이프의 일반적인 구현에는 포크가 있습니다.
muru

쉘과 달리 "mv"가 / usr / bin / mv 등을 포괄하는 쉘과 달리 "파일 당 한 번 포크로 이름을 바꾸지 않습니다"를 의미했습니다. "rename"명령은 libc에서 rename ()을 직접 호출하는 perl 내부 명령이기 때문입니다. 물론 몇 가지 제한 사항이 있지만이 특정 예에서는 이러한 제한 사항이 적용되지 않습니다.
sitaram

1
그것은 rename명령에 대해서도 마찬가지입니다 ( top answer , Perl도 사용합니다), 단순히 대답에 "포크 없음"보다 조금 더 설명을 추가해야 할 수도 있습니다.
muru
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.