답변:
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' {} +