현재 파일 목록을 날짜별로 하위 디렉터리로 구성할 수 있는 스크립트를 작성하려고 합니다. 날짜는 . 형식으로 각 파일의 첫 번째 줄에 포함됩니다 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