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外壳
如果您需要可移植的解决方案,请对文件使用 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