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
. 각 파일에 대해 코드는 다음과 같이 실행됩니다.
- 디렉터리 경로 생성을 허용하는 시스템 라이브러리가 포함되어 있습니다.
YYYY_MM_DD
파일 이름 시작 부분의 구조와 일치합니다.- 해당 디렉터리 경로 생성
YYYY/MM/DD
(필요한 경우) 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