다음 형식의 이름을 가진 파일이 많이 있습니다.
Schedule_20210109-235901.jpg
즉, 일정_날짜-시간.jpg
파일의 간격은 평균 3초이고 bash 스크립트를 작성하고 더 큰 시간으로 구분된 파일을 선택하여 이름을 바꾸고 싶습니다. for 루프와 if 문이 있는 bash 스크립트가 필요하다고 생각하지만 이전에는 bash를 실제로 사용한 적이 없습니다.
맥락상 지난 2년 동안 웹캠 사진을 저장해 두었는데 타임랩스를 만들고 싶었습니다. 그러나 3초 간격에서는 내가 촬영하는 스튜디오에서는 대부분 아무 일도 일어나지 않기 때문에 이것은 기본적으로 중복됩니다. 불필요한 사진을 삭제하거나 많은 데이터를 이동하고 싶지 않습니다.
내 생각은 30초, 1분, 심지어 1시간 간격으로 파일 시작 부분에 "use"를 추가하는 bash 스크립트를 만드는 것입니다. 그런 다음 ffmepg로 전달됩니다. 가끔 좀 더 자세한 영상을 만들고 싶을 때 같은 기법을 사용해서 골라낼 수 있어요.
정규식이나 와일드카드를 사용하여 이 작업을 수행하는 방법을 모르겠습니다.
어떤 점이라도 대단히 감사하겠습니다.
답변1
"간격" 논리를 기반으로 파일을 선택하고 새 디렉터리에 복사(이름 바꾸기 아님)한 다음 실행할 수 있습니다 ffmpeg
. 매개변수 스트림을 제공하는 ffmpeg
것은 원래 생각했던 것보다 낫습니다 -i file
. 해키적인 것 외에도 쉘 명령의 길이와 같은 몇 가지 제한이 있을 수 있습니다.
다음은 첫 번째 사진부터 시작하여 10장의 사진마다 하나씩 가져오는 예입니다. 순서는 알파벳 오름차순이므로 파일 이름 타임스탬프 기준입니다.
printf '%s\n' Schedule_* | awk 'NR%10==1' | xargs cp -t temp/ --
또는 0으로 구분된 GNU 인수를 사용하여 파일 이름을 요약합니다.
printf '%s\0' Schedule_* | awk 'NR%10==1' RS='\0' ORS='\0' | xargs -r0 cp -t temp/ --
선택하는 또 다른 방법이 있습니다. 타임스탬프를 분리할 수 있습니다. 다음 예를 참조하세요.
printf '%s\n' Schedule_* | awk '{print substr($0,10,15)}'
반품 20210109-235901
등 이를 사용하여 다양한 방법으로 많은 수의 파일 이름을 필터링할 수 있습니다. 예를 들어, 시간당 하나의 이미지(이 시간에 존재하는 경우 첫 번째 이미지)만 가져오려면 다음을 수행합니다.
printf '%s\n' Schedule_* | awk '!seen[substr($0,10,11)]++'
아니면 분당 하나의 이미지를 얻으세요:
printf '%s\n' Schedule_* | awk '!seen[substr($0,10,13)]++'
파일 선택의 시작 및 종료 시간을 추가할 수도 있습니다. 예를 들어 일정 기간 동안 각 시간에 대한 첫 번째 이미지를 가져옵니다.
printf '%s\n' Schedule_* | awk '
substr($0,10,15)>"202201" && substr($0,10,15)<"20220201-12" && !seen[substr($0,10,13)]++
'
모든 경우에 인수를 xargs
- 로 연결하여 cp
나중에 ffmpeg
글로빙 옵션을 사용하여 임시 디렉터리로 실행할 수 있습니다.
답변2
나는 bash 스크립트를 사용하여 내 개인적인 경험을 바탕으로 작동하지 않을 것이라고 생각하는 모든 이미지의 이름을 바꾸는 것 같습니다. iv 타임스탬프를 추가하기 위해 비슷한 프로세스를 거쳤습니다. bash 스크립트에서 AWK를 사용할 수도 있다고 생각합니다. 각 파일 옆에 직접 추가하세요. 타임스탬프 또는 이름 바꾸기 유틸리티
예를 들어
대문자 파일의 이름을 소문자로 바꿉니다.
rename 'y/A-Z/a-z/‘ *
여러 파일에서 파일 확장자를 제거하려면 다음 구문을 사용하십시오. 이 예에서는 .bak 확장자를 제거합니다.
rename 's/\.bak$//' *.bak
아래 참고자료입니다 https://linuxconfig.org/how-to-rename-multiple-files-on-linux