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

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

내 디렉터리에는 /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

답변1

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

만족스러우면 제거하세요 -n.

답변2

노력하다:

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

답변3

모든 파일이 5개의 숫자로 시작한다고 가정하므로 다음을 사용하십시오.잘라내기 명령초기 번호 파일을 "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의 하위 문자열

답변4

포크가 없는 경우:

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

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

(Perl의 이름 바꾸기 명령에는 몇 가지 제한 사항이 있지만 이 특별한 경우에는 적용되지 않습니다.)

앞서 표시된 명령 은 rename그렇습니다. 작동하지만 두 가지 다른 이름 바꾸기 유형 사이에 혼동이 생길 수 있습니다. 올바른 것이 있으면 좋지만 그렇지 않은 경우에도 효과가 있습니다.

perl-rename 명령이 없고 설치할 수 없는 경우 다음을 수행할 수 있습니다.

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

보시다시피 이것은 최상위 답변에 표시된 것과 동일한 대체를 사용합니다. 물론 perl-rename에는 다른 부가 기능도 있습니다( -n상단 답변에서 이미 언급한 다음 -0, -f, 등이 있습니다). 더 많이 필요할수록 이 방식으로 스크롤하는 대신 더 많이 설치해야 합니다.

관련 정보