파일을 1개 또는 2개의 디렉터리에 복사하고 이름을 바꿉니다.

파일을 1개 또는 2개의 디렉터리에 복사하고 이름을 바꿉니다.

저는 Linux를 처음 사용하고 현재 다운로드한 파일을 정리하려고 합니다.

.srt기본적으로 하위 디렉터리에서 파일을 가져와 다른 파일과 함께 기본 디렉터리로 이동하고 이름을 바꾸고 싶습니다 .

현재 실행중인 스크립트는 다음과 같습니다.

find "/foo/bar" -type f -iname '*.srt' -exec sh -c '
    path="${1%/*}"; filename="${1##*/}";
    cp "${1}" "${path%/*}/${path##*/}.${filename}" ' sh_cp {} \;

이 접근 방식은 구조가 다음과 같을 때 충분합니다.

├── Some.Folder.Name
    ├── Some.Video.Name.mkv
    └── Subs
        └── 2_Eng.srt

2_Eng.srt복사 되어 Some.Folder.Name이름이 로 변경 됩니다 Some.Folder.Name.2_Eng.srt.

.srt그러나 다음과 같이 폴더에 이중으로 중첩된 일부 파일을 발견했습니다 .

├── Some.Other.Folder.Name
    ├── Some.Other.Video.Name.mkv
    ├── Some.Other.Video.Name2.mkv
    └── Subs
        ├── Video1
        │   └── 2_Eng.srt
        └── Video2
            └── 2_Eng.srt

내가 실행 중인 스크립트는 적절하게 이름을 바꾸지만( ) 해당 디렉토리 Video1.2_Eng.srt로만 이동됩니다 . Subs나는 그들이 Some.Other.Folder.Name.

path%/*세부 쉘 1##*/매개변수 확장 에서 스크립트를 얻은 스레드입니다 . 그렇다면 파일을 넣을 특정 디렉터리를 격리할 수 있는 방법이 있습니까? 디렉토리 이름은 변경될 수 있지만 항상 입니다 foo/bar.

내가 성취하려는 것이 가능한가?

답변1

어떤 의미에서 당신이 요구하는 것은 불가능합니다. 고려 사항:  find비슷한 이름을 찾은 경우

/foo/bar/Some.Other.Folder.Name/Subs/Video1/2_Eng.srt

이 명령은 무엇을 해야 합니까? 파일을 다음 위치로 이동하고 싶다는 것을 "알고 있습니다".

/foo/bar/Some.Other.Folder.Name/Video1.2_Eng.srt

— 내 요점은 파일 이름에서 명확하지 않다는 것입니다.

파일을 이동할 위치를 지정해야 합니다.

find /foo/bar -type f -iname '*.srt' -exec sh -c '
    path="${1%/*}"; filename="${1##*/}";
    cp "${1}" "/foo/bar/${path##*/}.${filename}" ' sh_cp {} \;

이것을 스크립트에 넣으면 시작 디렉터리를 매개변수화할 수 있도록 만들어야 합니다. 그러나 문제가 있습니다.  cp명령이 자체 인수 목록이 있는 하위 쉘에 있습니다. 나는 이 접근 방식이 안전하다고 생각합니다.

find "$1" -type f -iname '*.srt' -exec sh -c '
    path="${1%/*}"; filename="${1##*/}";
    cp "$1" "$2/${path##*/}.${filename}" ' sh_cp {} "$1" \;

$1이는 스크립트의 시작 디렉토리를 두 ​​번째 인수로 서브쉘에 전달하므로 $2.

관련 정보