폴을 개선해 보세요답변:

폴을 개선해 보세요답변:

따라서 현재 경로는 다음과 같습니다.

../CAMERA3/serialnum/2016-12-19/001/dav/07/07.02.53-07.03.14[M][0@0][0].dav

최종 목표:

../CAMERA3/2016-12-19_07.02.53-07.03.14.dav

그래서 저는 기본적으로 다음과 같이 일부 디렉토리 이름과 파일 이름의 일부를 추출하기 위한 for 루프를 찾으려고 노력하고 있습니다.

mv ../$dir1/$dir2/$dir3/$dir4/$dir5/$dir6/$filenameportion[M][0@0][0].dav ../$dir1/$dir3_$filenameportion.dav

답변1

마침내 사용해야했다. 조금 추악하지만 작동합니다.

find /mnt/test -name '*.dav' -exec sh -c 'for filename do 
    if [[ $(basename "$filename") != C*.dav ]];then
        find "$filename" -type f -execdir ~/bin/rnm -y "$filename" -ns '/pd05/_/pd03/_/n/.dav' \;
    fi
done' find-sh {} \;

find /mnt/test -name '*.dav' -exec sh -c 'for filename do 
    rename "[M][0@0][0]" "" "$filename" 
done' find-sh {} \;

find /mnt/test -name '*.dav' -type f -execdir sh -c 'mv "$@" ./../../../../..' find-sh {} \;

추신: 예, 저는 사용자입니다. 처음에는 게스트로 게시한 후 이메일 링크를 따라 계정을 만들었습니다. 놀랍게도 자동이 아닙니다. 백슬래시 혼동으로 인해 죄송합니다. 파일을 Windows 노트북에 복사한 후 게시를 위해 다시 변경하는 것을 잊어버렸습니다.

업데이트 1: 출력을 찾기 위해 루프를 제거했습니다.

답변2

폴을 개선해 보세요답변:

아래 코드:

find /mnt/test -name '*.dav' -exec sh -c 'for filename do 
    if [[ $(basename "$filename") != C*.dav ]];then
        find "$filename" -type f -execdir ~/bin/rnm -y "$filename" -ns '/pd05/_/pd03/_/n/.dav' \;
    fi
done' find-sh {} \;

다음과 같이 최적화할 수 있습니다( find또는 for루프 없이).

rnm -y -ns '/pd5/_/pd3/_/n/.dav' -ss '^[^C].*\.dav$' -fo -dp -1 /mnt/test

설명하다:

-ss: 검색 문자열(정규식)입니다. 위에 사용된 정규식은 .dav로 끝나거나 시작하지 않는 파일을 검색합니다 C.

-fo: 파일 모드에만 해당됩니다.

-dp: 깊이. -1무제한 깊이를 의미합니다. 즉, 모든 하위 디렉터리로 이동합니다.

-ns:name 문자열(새 이름)

/pd<digit>/: 다양한 수준의 상위 디렉터리 이름을 나타내는 이름 문자열 규칙: 0은 바로 상위 디렉터리, 1은 위 디렉터리 등입니다.

/n/: 확장자가 없는 파일 이름을 나타내는 또 다른 이름 문자열 규칙입니다. (성명) /n/.dav으로 대체할 수 있습니다 ./fn/

-y--yes: 모두 확인하세요 ( ).

관련 정보