파일에 포함된 날짜별로 파일을 정리하세요.

파일에 포함된 날짜별로 파일을 정리하세요.

현재 파일 목록을 날짜별로 하위 디렉터리로 구성할 수 있는 스크립트를 작성하려고 합니다. 날짜는 . 형식으로 각 파일의 첫 번째 줄에 포함됩니다 YYYY-MM-DD. head 명령을 사용하여 각 파일의 첫 번째 줄을 추출하고 이를 파일 경로로 사용할 수 -있도록 교체 /했습니다 .YYYY/MM/DD

그런 다음 하위 디렉터리를 만들고 싶습니다 YYYY>MM>DD. 예를 들어 날짜가 포함된 파일은 파일 경로 -> -> 2015/10/19에 저장됩니다 . 이러한 하위 디렉터리는 에서 생성되어야 합니다 ../2015./2015/10./2015/10/19~/fileList/

이것은 지금까지 내 코드입니다.

for file in ~/fileList/*
do
   head -1 $file | tr "-" "/")
done

샘플 파일입니다

2001-02-03
Thursday
Paris
44952

하위 디렉터리를 만들고 각 파일을 올바른 디렉터리에 저장하는 방법을 찾는 데 어려움을 겪고 있습니다. 모든 코드 제안에 크게 감사하겠습니다.

나는 bash 쉘을 사용하고 있습니다.

답변1

다음을 수행해야 합니다.

for file in ~/fileList/*
do
    newpath=$(head -1 "$file" | tr '-' '/')
    mkdir -p "$newpath"
    echo "would now execute 'mv $file $newpath'"
done

이렇게 하면 변환된 날짜가 변수에 저장되고 $newpath누락된 상위 디렉터리가 아직 없는 경우 디렉터리와 함께 디렉터리가 생성됩니다. 이 하위 디렉터리는 스크립트를 실행하는 디렉터리에 생성됩니다.

현재 형식에서는 실행될 명령을 인쇄합니다. 만족스러우면 다음으로 변경하세요.

mv "$file" "$newpath"

고쳐 쓰다:대상 디렉토리가 파일이 원래 있던 소스 디렉토리 아래에 있을 것이라고 명시했으므로 스크립트를 여러 번 실행하는 경우 새로 생성된 항목이 발견되지 않는지 확인해야 합니다.

  • .txt파일 확장자로 파일을 식별할 수 있으면 루프를 더욱 구체적으로 만들 수 있습니다 (예:) .
    for file in ~/fileList/*.txt
    do
        newpath=~/fileList/$(head -1 "$file" | tr '-' '/')
        ...
    done
    
  • 그렇지 않은 경우 한 가지 접근 방식은 일반 파일을 피연산자로 허용하는 것입니다.
    for file in ~/fileList/*
    do
        if [[ ! -f $file ]]; then continue; fi
        newpath=~/fileList/$(head -1 "$file" | tr '-' '/')
        mkdir -p "$newpath"
        mv "$file" "$newpath"
    done
    

관련 정보