파일 이름에서 특정 특수 문자 제거

파일 이름에서 특정 특수 문자 제거

폴더를 외장 하드 드라이브로 전송하는 데 문제가 있습니다. HD의 포맷을 변경하고 싶지 않습니다.

그래서 폴더에 100개의 파일이 있는데 복사를 방해하는 오류는 특수 문자로 인해 발생합니다(정확히 어느 문자인지는 모르겠지만 "|" 및 "."라고 생각하며 다른 문자도 있을 것으로 확신합니다. 수동으로 이름을 바꾸거나 제거했지만 고통스럽습니다.

제안은 가능하지만 파일 이름에서 특정 문자를 제거하거나(그렇게 하면 .m4a 등에서 문제가 발생할까요?) 필요한 경우 밑줄로 바꾸는 방법을 찾고 있는 것 같습니다. 내가 가진 유일한 단서는 perl rename이지만 아직 시도하지 않았습니다.

'y/|/_/' * 이렇게 이름을 바꾸시겠습니까?

어떤 제안이라도 감사드립니다

답변1

예, (Perl 기반) rename명령이 이에 대한 좋은 후보입니다. -n또는 --nono옵션을 추가하여 교체품을 시험적으로 실행할 수 있습니다. 예:

   -n, --nono
           No action: print names of files to be renamed, but don't rename.

예를 들면

$ rename -n 'y/|./__/' *\|*
rename(foo|bar.baz, foo_bar_baz)
rename(foo|bar|baz, foo_bar_baz)

참고할 rename~ 아니다이름이 고유하지 않은 경우 파일을 파괴적으로 덮어쓸 수 있습니다.

$ rename -v 'y/|./__/' *\|*
foo|bar.baz renamed as foo_bar_baz
foo|bar|baz not renamed: foo_bar_baz already exists

참고 .~ 아니다파일 이름과 관련된 특수 문자이므로 실제로 바꾸지 않는 것이 좋습니다.

답변2

일반적으로 mmv대량 이름 바꾸기 작업에 적합합니다.

하지만 이 특별한 경우에는 완전히 다른 경로를 택하겠습니다. 즉, 몇 가지 셸 명령을 사용하여 셸 스크립트를 생성하고, 그것이 실제로 내가 원하는 것인지 자세히 살펴본 다음 실행합니다.

대략적인 개요:

ls -Q >/tmp/old.txt
cp /tmp/old.txt /tmp/new.txt

ls -Q"foo*bar"각 이름 주위에 큰따옴표가 추가됩니다. 즉, 또는 이 표시됩니다 "foo | bar".

그런 다음 에서 원하지 않는 문자를 /tmp/new.txt수동으로 편집기나 sed -i -e(또는 perl -p -i -e​​원하는 경우) 또는 tr또는로 바꾸십시오 tr -d. 중요한:해당 파일의 순서를 변경하지 말고 어떤 줄도 삭제하거나 추가하지 마세요!

어쨌든, /tmp/new.txt새 이름이 실제로 원하는 모양인지 확인하기 위해 열심히 살펴보십시오.

중복된 이름이 있는지 확인하세요! ( sort /tmp/new.txt | uniq -r) 중복된 항목이 없는지 확인하고, 있는 경우 해당 줄을 수동으로 편집하여 고유한 이름을 얻으세요.

그런 다음 파일을 명령과 함께 넣고 paste각 줄을 mv명령으로 변경합니다.

paste /tmp/old.txt /tmp/new.txt | sed -e 's/^/mv -n /' >/tmp/bulk-rename

이 명령이 하는 일은 한 줄 과 한 줄을 paste가져 와서 그 사이에 공백을 두고 한 줄에 함께 배치하는 것입니다. 이 부분은 각 줄의 시작 부분에 a를 추가합니다. 기존 파일을 덮어쓰는 것을 방지합니다./tmp/old.txt/tmp/new.txtsedmv -nmv -n

이제 해당 파일에는 다음과 같은 많은 줄이 포함되어 있습니다.

mv -n "foo" "bar"
mv -n "abc" "def"

파일을 다시 살펴보고 원하는 파일이라고 확신하면 sh /tmp/bulk-rename.

관련 정보