YYYY_MM_DD_HH:MM:SS.swf
フォルダにダンプする/home/user/dump/
形式のファイルがあります
これらのファイルを、ファイル名の/home/user/save/year/month/day/
に基づいて新しいディレクトリツリーYYYY_MM_DD
に移動したいと思います。あるいは、これらがファイル変更日までに変更できる場合は、それも許容されます。ここで他のスクリプトをいくつか見つけましたが、探しているすべての情報が含まれていないようです。
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")
Perlベースのrename
(prename
とも呼ばれる)がある場合は、次の1つのコマンドでこれを実行できます。
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
ディレクトリに移動(名前変更)します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'
移植可能なソリューションが必要な場合は、ファイルに対してシェルループを使用し、シェル文字列操作を使用してファイル名の一部を抽出します。
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
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