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

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

다음 두 게시물에 이어:

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 {} \;

(명령이 괜찮아 보이면 "echo"를 제거하십시오)

.
└── 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//\//-}"'

관련 정보