요청: 전송할 때 파일 끝에 {number}을(를) 추가하세요

요청: 전송할 때 파일 끝에 {number}을(를) 추가하세요

수천 개의 디렉터리가 있고 각 디렉터리에는 file.jpg이름이 지정된 파일이 있는 하위 디렉터리가 있습니다. 각 하위 디렉터리에는 이름이 지정된 파일이 있으므로 file.jpg이 모든 파일을 동일한 폴더로 전송할 수 없습니다. 아니면 마지막 파일(하나)까지 서로를 덮을 뿐입니다. file.jpg남았습니다.

대신 다음을 수행하기 위해 몇 가지 명령을 터미널에 붙여넣고 싶습니다.

  1. 리뷰 폴더에 복사한 후 {number}내용별로 추가하세요 . file.jpg참고: 수천 개의 파일이 있을 수 있으므로 중지할 위치에 제한이 없어야 합니다. file34634657.jpg예를 들어 마지막 파일은 .

file{number}.jpg부가 질문: 복사본을 원래 디렉터리/하위 디렉터리로 다시 추적할 수 있는 방법이 있습니까 ? 이러한 file.jpg디렉터리에는 확인해야 할 추가 하위 디렉터리와 파일이 포함되어 있습니다.

답변1

번호 추가가 필수가 아닌 경우 파일 이름에 경로를 추가할 수 있습니다. 이렇게 하면 두 가지 "문제"(파일을 덮어쓰고 역추적할 수 없음)를 모두 해결할 수 있습니다.

for ef in $(find * -name file.jpg); do cp $ef /path/to/dest_dir/$(echo $ef | sed 's,/,--,g'); done

- - 파일의 시작 부분을 제거 find *하려면 , - - sed를 사용하여 다음으로 변경합니다 (이 명령을 사용하면 역추적할 수 있거나 대신 더 구체적인 것을 사용할 수 있습니다 ).*./
$(echo $ef | sed 's,/,--,g')/----

편집(아래 OP의 설명으로 인해):
디렉토리에 공백/공백이 포함된 경우 IFS(내부 필드 구분 기호)를 변경하세요.
필요한 경우 현재 백업을 수행하고 명령이 끝나면 복원할 수 있습니다.

old_IFS=$IFS; IFS=$'\n'; for ef in $(find * -name file.jpg); do cp $ef dest_dir/$(echo $ef | sed 's,/,--,g;s/ /_/g'); done; IFS=$old_IFS
  • old_IFS=$IFS- 현재 IFS를 백업합니다(기본적으로 , spacetab) newline.
  • IFS=$'\n'- 단어 분할을 피하기 위해 IFS를 newline(만 )으로 설정합니다 .newlinespace
  • IFS=$old_IFS- IFS를 기본값으로 복원합니다.

물론, s/ /_/g파일(대상 위치)에 디렉터리의 공백이 포함되도록 하려면 두 번째 sed 스크립트를 제거하고 하나만(첫 번째 스크립트)만 유지할 수 있습니다.

관련 정보