根据文件名将文件移动到目录年/月/日

根据文件名将文件移动到目录年/月/日

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外壳

如果您需要可移植的解决方案,请对文件使用 shell 循环,并使用 shell 字符串操作来提取文件名的部分。

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

相关内容