ファイル名に基づいて年/月/日ディレクトリにファイルを移動します。

ファイル名に基づいて年/月/日ディレクトリにファイルを移動します。

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

関連情報