수천 개의 디렉터리가 있고 각 디렉터리에는 file.jpg
이름이 지정된 파일이 있는 하위 디렉터리가 있습니다. 각 하위 디렉터리에는 이름이 지정된 파일이 있으므로 file.jpg
이 모든 파일을 동일한 폴더로 전송할 수 없습니다. 아니면 마지막 파일(하나)까지 서로를 덮을 뿐입니다. file.jpg
남았습니다.
대신 다음을 수행하기 위해 몇 가지 명령을 터미널에 붙여넣고 싶습니다.
- 리뷰 폴더에 복사한 후
{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를 백업합니다(기본적으로 ,space
및tab
)newline
.IFS=$'\n'
- 단어 분할을 피하기 위해 IFS를newline
(만 )으로 설정합니다 .newline
space
IFS=$old_IFS
- IFS를 기본값으로 복원합니다.
물론, s/ /_/g
파일(대상 위치)에 디렉터리의 공백이 포함되도록 하려면 두 번째 sed 스크립트를 제거하고 하나만(첫 번째 스크립트)만 유지할 수 있습니다.