폴더를 외장 하드 드라이브로 전송하는 데 문제가 있습니다. 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.txt
sed
mv -n
mv -n
이제 해당 파일에는 다음과 같은 많은 줄이 포함되어 있습니다.
mv -n "foo" "bar"
mv -n "abc" "def"
파일을 다시 살펴보고 원하는 파일이라고 확신하면 sh /tmp/bulk-rename
.