답변:
find -type f -name '*.png' -printf '%P\0' | \
while read -d $'\0' i ; do cp "$i" "${i////_}" ; done
%P말할 find선두를 생략 ./;
\0알 find은 USING 패스 인쇄 ASCII NUL세퍼레이터로서 문자 (이 문제 피해야 이상한 이름);
-d $'\0'말할 bash경로를 읽기위한 적절한 구분 기호를 사용하는;
${i////_}이야기 bash의 모든 발생을 대체 /하여 _경로한다.
이 파이프 라인에는 파일 덮어 쓰기가 포함될 수 있으므로 적절한 예방 조치를 취하십시오.
이것은 나를 위해 잘 작동했습니다. ._ 접두사를 제거하지만 potong의 답변 과 동일 합니다.
find . -type f -name "*" | sed 's/$/"/;s/^/"/;h;s/^...//;s/^/"/;y/\//_/;H;g;s/\n/ /g;s/^/cp -v /' | sh
위의 몇 가지 훌륭한 답변이지만 나는 경우를 대비하여 내 것을 넣을 것입니다.
이것은 단지 의지 echo아웃 mv명령 :
find . -type f -exec sh -c 'for f do x=${f#./}; y="${x// /_}"; echo "mv ${x// /\ } ${y////-}"; done' {} +
이 것입니다 단지 echo밖으로 mv직접 대지로 명령 :
find . -type f -exec sh -c 'for f do x=${f#./}; y="${x// /_}"; echo "mv ${x// /\ } ${y////-}"; done' {} + | pbcopy
[주의] 이것은 mv당신을 위해 즉시 명령을 실행합니다 :
find . -type f -exec sh -c 'for f do x=${f#./}; y="${x// /_}"; eval "mv ${x// /\ } ${y////-}"; done' {} +