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