날짜를 기준으로 특정 파일 찾기 및 표시

날짜를 기준으로 특정 파일 찾기 및 표시

나는 카메라를 가지고 있고 매일 그것을 기록합니다. 이 mp4 파일은 항상 yy-mm-dd로 시작합니다. 오늘 기록이 있는지 검색하고 표시하고 확인하는 bash 스크립트를 작성하고 싶습니다.

지금까지 나는 이것을 생각해 냈습니다.

#! /bin/sh
# start met datum weg te schrijven in variable now met notering jj-mm-dd

now=$(date --rfc-3339=date)`

# regels voor Doorbird

cd /srv/dev-disk-by-uuid-89755130-b502-4d16-943d-6ca02a695f09/Cams
cd Doorbird
cd videos
cd OOKJv2iZ0r
cd 8MaU67FrBu80

[ -f "/srv/dev-disk-by-uuid-89755130-b502-4d16-943d-6ca02a695f09/Cams/Doorbird/videos/OOKJv2iZ0r/8MaU67FrBu80/"$now"*" ] && echo "Doorbird OK."
[ ! -f "/srv/dev-disk-by-uuid-89755130-b502-4d16-943d-6ca02a695f09/Cams/Doorbird/videos/OOKJv2iZ0r/8MaU67FrBu80/"$now"*" ] && echo "Doorbird NOK."

하지만 이는 Doorbird NOK위 폴더에 yy-mm-dd로 시작하는 파일이 존재한다는 것만을 보여줍니다.

파일을 다르게 정렬하는 다른 카메라를 사용하여 날짜 변수에 대한 디렉토리 검색을 수행할 수 있었지만 *-와일드카드 없이 아무런 문제도 발생하지 않았습니다. 이 코드의 코드는 다음과 같습니다.

# regels voor Tuin
cd /srv/dev-disk-by-uuid-89755130-b502-4d16-943d-6ca02a695f09/Cams
cd 6J0091EPAG73D8B
[ -d "/srv/dev-disk-by-uuid-89755130-b502-4d16-943d-6ca02a695f09/Cams/6J0091EPAG73D8B/"$now"" ] && echo "Tuin OK."
[ ! -d "/srv/dev-disk-by-uuid-89755130-b502-4d16-943d-6ca02a695f09/Cams/6J0091EPAG73D8B/"$now"" ] && echo "Tuin NOK."

Tuin OK여기에서 디렉토리가 존재하는지 여부를 알 수 있습니다 Tuin NOK.

분명히 여기에 뭔가가 빠졌습니다. 나는 사이트 전체에서 와일드카드 위치를 찾으려고 노력했지만 성공하지 못했습니다.

답변1

코드에 많은 문제가 있음을 알 수 있습니다.

먼저 날짜 형식의 파일을 찾고 있지만 YY-MM-DD명령 date --rfc-3339=date이 날짜 형식을 반환합니다 YYYY-MM-DD. 시도 해봐:

date --rfc-3339=date
2021-12-10

둘째, [ -f {file} ]구조에는 파일이 하나만 필요합니다. 와일드카드가 있다는 것은 *정확히 하나의 파일이 발견되지 않는 한 패턴이 단지 하나가 아닌 일치하는 모든 파일을 찾는다는 것을 의미합니다.

셋째, 덜 중요한 점은 스크립트를 사용하여 디렉토리를 변경하는 경우 구조의 전체 경로가 cd필요하지 않다는 것입니다 . 이미 올바른 위치에 있습니다.[ -f {file} ]

이제 드디어 태그가 되었습니다.sh그러나 스크립트를 스크립트 로 선언했습니다 . 이를 사용하려면 bash스크립트의 첫 번째 줄( )에 #!/bin/bash표시 해야 합니다. 그러나 이 경우 특정 bash관용구를 사용하지 않으므로 계속 진행할 수 있습니다 sh.

#!/bin/sh
# start met datum weg te schrijven in variable now met notering jj-mm-dd

now=$(date +'%y-%m-%d')    # format "YY-MM-DD"

# regels voor Doorbird
cd /srv/dev-disk-by-uuid-89755130-b502-4d16-943d-6ca02a695f09/Cams &&
  cd Doorbird &&
  cd videos &&
  cd OOKJv2iZ0r &&
  cd 8MaU67FrBu80 || exit

# We're now in the right place so use short filenames
numberOfFiles=$(find . -maxdepth 1 -type f -name "${now}*" -printf . | wc -c)

if [ "$numberOfFiles" -gt 0 ]
then
    echo "Doorbird OK"
else
    echo "Doorbird NOK."
fi

여러 명령을 피하려면 cd다음에 대한 전체 디렉터리 경로를 제공할 수 있습니다 find.

numberOfFiles=$(
    find /srv/dev-disk-by-uuid-89755130-b502-4d16-943d-6ca02a695f09/Cams/Doorbird/videos/OOKJv2iZ0r/8MaU67FrBu80 -maxdepth 1 -type f -name "${now}* -printf ." |
    wc -c
)

또는 경로가 포함된 변수를 선언하고 해당 변수를 통해 참조할 수도 있습니다.

dir=/srv/dev-disk-by-uuid-89755130-b502-4d16-943d-6ca02a695f09/Cams/Doorbird/videos/OOKJv2iZ0r/8MaU67FrBu80
# ...
numberOfFiles=$(find "$dir" -maxdepth 1 -type f -name "${now}*" -printf . | wc -c)

관련 정보