Bash에서 폴더 구조를 파일 이름으로 병합


4

이 구조에서 파일을 변환하려고합니다.

foldera/folderb/filec.png

에:

foldera_folderb_filec.png

나는 반쯤 있습니다.

 find . -type f -name "*.png" | sed 's@^./@@g;s@/@-@g'

기본적으로 이름 구조를 변환합니다. 그러나 아직 복사하지 않습니다. 이 시점에서 나는 붙어 있습니다. 실제로 복사 작업을 수행하기 위해 스크립트를 확장하려면 어떻게해야합니까?

답변:


1

이것은 당신을 위해 일할 수 있습니다 :

find . -type f -name "*.png" | sed 'h;y/\//_/;H;g;s/\n/ /g;s/^/cp -v /' | sh

와우. 모든 파일이 '._'로 시작하는 것을 제외하고는 기본적으로 작동합니다.
reinier

1
find -type f -name '*.png' -printf '%P\0' | \
while read -d $'\0' i ; do cp "$i" "${i////_}" ; done

어디:

  • %P말할 find선두를 생략 ./;

  • \0find은 USING 패스 인쇄 ASCII NUL세퍼레이터로서 문자 (이 문제 피해야 이상한 이름);

  • -d $'\0'말할 bash경로를 읽기위한 적절한 구분 기호를 사용하는;

  • ${i////_}이야기 bash의 모든 발생을 대체 /하여 _경로한다.

경고:

이 파이프 라인에는 파일 덮어 쓰기가 포함될 수 있으므로 적절한 예방 조치를 취하십시오.


찾기 : 불법 옵션-t. 찾기 : 불법 옵션-y. 찾기 : 불법 옵션-p. 찾기 : 불법 옵션-e. 찾기 : -printf : 알 수없는 옵션 = (Mac에 있다고 말 했어야합니까?
reinier

1

이것은 나를 위해 잘 작동했습니다. ._ 접두사를 제거하지만 potong의 답변 과 동일 합니다.

find . -type f -name "*" | sed 's/$/"/;s/^/"/;h;s/^...//;s/^/"/;y/\//_/;H;g;s/\n/ /g;s/^/cp -v /' | sh

0

위의 몇 가지 훌륭한 답변이지만 나는 경우를 대비하여 내 것을 넣을 것입니다.

이것은 단지 의지 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' {} +
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.