모든 상위 디렉터리의 접두사를 추가하여 파일 이름을 수정하여 하위 디렉터리 및 하위 디렉터리의 모든 파일을 기본 디렉터리로 복사합니다.

모든 상위 디렉터리의 접두사를 추가하여 파일 이름을 수정하여 하위 디렉터리 및 하위 디렉터리의 모든 파일을 기본 디렉터리로 복사합니다.

다음 두 게시물에 이어:

https://askubuntu.com/questions/871898/move-files-to-parent-directory-prefixing-file-name-with-former-subdirectory-nam

https://askubuntu.com/questions/870844/recursively-add-directory-name-to-file-name

저도 똑같이 하고 싶지만 이동하는 대신 복사하는 방법을 사용하고 싶습니다. 간단히 말해서, 하위 디렉터리와 하위 디렉터리가 포함된 디렉터리가 있고 그 안에 일부 파일이 있습니다. 모든 파일을 다른 대상 폴더에 복사하고 싶지만 일부 파일에는 정확한 이름이 있으므로 파일 이름에 접두사로 상위 디렉터리의 이름을 첨부하고 싶습니다.

우분투 16.04에서 실행 중입니다.

답변1

노력하다:

find  -name "*.dat" -exec bash -c 'echo cp "$1" "$(sed -e s:/:-:g -e s:^.-:./: <<<"$1")"' tinyscript {} \;

(명령이 괜찮아 보이면 "에코"를 제거하세요)

.
└── 1
    └── 2
        ├── 3
        │   └── 4
        │       └── foo.dat
        └── foo.dat

수확량:

cp ./1/2/3/4/foo.dat ./1-2-3-4-foo.dat
cp ./1/2/foo.dat ./1-2-foo.dat

기본적으로 일치하는 각 파일에 대해 임시 작은 스크립트를 실행 하면 이 스크립트는 소스 경로의 cp "$1" "$(sed -e s:/:-:g -e s:^.-:./: <<<"$1")"모든 항목을 로 대체하여 대상 이름을 생성합니다 . 문자열은 무엇이든 될 수 있으며 스크립트 이름으로 사용되는 이름일 뿐입니다. 오류가 발생한 경우./-tinyscript

답변2

성능보다 단순성을 선호하므로 이는 특히 효율적이지 않습니다(각 파일에 대해 bash 프로세스를 시작하기 때문에). 파일이 많거나 시간이 중요한 요소인 경우 더 복잡한 솔루션이 필요할 수 있습니다.

find yourdirectory/ -type f -print0 | xargs -0 -I% bash -c 'F="%" ; echo cp "${F}" "${F//\//-}"'

관련 정보