web-dev-qa-db-ja.com

ファイル名に基づいてファイルをディレクトリYear / Month / Dayに移動します

YYYY_MM_DD_HH:MM:SS.swfフォルダにダンプする/home/user/dump/形式のファイルがあります

これらのファイルを、ファイル名の/home/user/save/year/month/day/に基づいて新しいディレクトリツリーYYYY_MM_DDに移動したいと思います。あるいは、これらがファイル変更日までに変更できる場合は、それも許容されます。ここで他のスクリプトをいくつか見つけましたが、探しているすべての情報が含まれていないようです。

1
RickA
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")
0
Gregg Leventhal

Perlベースのrenameprenameとも呼ばれる)がある場合は、次の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のかなり醜い(誤)使用です。ファイルごとに、コードは次のように実行されます

  1. ディレクトリパスの作成を可能にするシステムライブラリを含める
  2. ファイル名の先頭にあるYYYY_MM_DD構造体と照合します
  3. 対応するディレクトリパスを作成しますYYYY/MM/DD(必要な場合)
  4. ファイルの名前を変更せずに、ファイルをYYYY/MM/DDディレクトリに移動(名前変更)します
3
roaima

Zsh

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
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
0
MelBurslan