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