이 구조에서 파일을 변환하려고합니다.
foldera/folderb/filec.png
에:
foldera_folderb_filec.png
나는 반쯤 있습니다.
find . -type f -name "*.png" | sed 's@^./@@g;s@/@-@g'
기본적으로 이름 구조를 변환합니다. 그러나 아직 복사하지 않습니다. 이 시점에서 나는 붙어 있습니다. 실제로 복사 작업을 수행하기 위해 스크립트를 확장하려면 어떻게해야합니까?
답변
이것은 당신을 위해 일할 수 있습니다 :
find . -type f -name "*.png" | sed 'h;y/\//_/;H;g;s/\n/ /g;s/^/cp -v /' | sh
답변
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' {} +