따라서 현재 경로는 다음과 같습니다.
../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
: 모두 확인하세요 ( ).