저는 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
.