파일 이름을 기준으로 연/월/일 디렉터리로 파일을 이동합니다.

파일 이름을 기준으로 연/월/일 디렉터리로 파일을 이동합니다.

YYYY_MM_DD_HH:MM:SS.swf다음 형식으로 폴더에 파일을 덤프했습니다./home/user/dump/

/home/user/save/year/month/day/파일 이름을 기준으로 YYYY_MM_DD이 파일을 새 디렉터리 트리로 이동 하고 싶습니다 . 또는 파일 수정 날짜 이전에 내용을 수정할 수 있는 경우에도 허용됩니다. 여기에서 몇 가지 다른 스크립트를 찾았지만 여기에는 내가 찾고 있는 정보가 모두 포함되어 있지 않은 것 같습니다.

답변1

Perl 기반 rename(때때로 라고도 함 prename)을 사용하는 경우 단일 명령으로 이 작업을 수행할 수 있습니다.

cd /home/user/dump
rename -v 'use File::Path qw(make_path); m!^((....)_(..)_(..)_(.*))!; my $d = "$2/$3/$4"; make_path($d); s!^!$d/!' *

실제로 이는 사실입니다 rename. 각 파일에 대해 코드는 다음과 같이 실행됩니다.

  1. 디렉터리 경로 생성을 허용하는 시스템 라이브러리가 포함되어 있습니다.
  2. YYYY_MM_DD파일 이름 시작 부분의 구조와 일치합니다.
  3. 해당 디렉터리 경로 생성 YYYY/MM/DD(필요한 경우)
  4. YYYY/MM/DD이름을 변경하지 않고 파일을 해당 디렉터리로 이동(이름 바꾸기)

답변2

지쉬

사용zmv함수는 와일드카드 표현식과 일치하는 파일을 이동하거나 이름을 바꿉니다. 대상 디렉터리를 생성하는 기본 제공 방법이 없으므로 이를 수행하는 함수를 제공했습니다.

autoload -U zmv
mkdir_mv () {
  mkdir -p -- ${(P)#:h}
  mv -- $@
}
cd /home/user/dump
zmv -p mkdir_mv '(????)_(??)_(??)_??:??:??.swf' '/home/user/save/$1/$2/$3/$f'

POSIX 쉘

이식 가능한 솔루션이 필요한 경우 파일에 대해 쉘 루프를 사용하고 쉘 문자열 조작을 사용하여 파일 이름의 일부를 추출하십시오.

cd /home/user/dump
for f in ????_??_??_??:??:??.swf; do
  year=${f%%_*}; suffix=${f#*_}
  month=${suffix%%_*}; suffix=${suffix#*_}
  day=${suffix%%_*}
  mkdir -p "/home/user/save/$year/$month/$day"
  mv "$f" "/home/user/save/$year/$month/$day/$f"
done

답변3

while read file
 do 
     f=$(basename $file)
     year=$(echo "$f"|cut -f1 -d_)
     day=$(echo "$f"|cut -f3 -d_)
     month=$(echo "$f"|cut -f2 -d_)
     new_dir="/home/user/save/$year/$month/$day"
     mkdir -p "$new_dir"
     mv "$file" "$new_dir"
done < <(find /home/user/dump -type f -name "*_*_*_*:*:*.swf")

답변4

for file in $(find /home/user/dump/ -name "*.swf")
do
  year=$(echo ${file}|cut -d_ -f1)
  month=$(echo ${file}|cut -d_ -f2)
  day=$(echo ${file}|cut -d_ -f3)
  if [ ! -d /home/user/save/${year}/${month}/${day} ]
  then
    mkdir -p /home/user/save/${year}/${month}/${day}
  fi
  mv ${file} /home/user/save/${year}/${month}/${day}
done

관련 정보