所以我有一个电影文件夹,看起来像
Current
movie1 (1962).mkv
movie 2b (1993)
movie 2b (1993) cd1.mp4
movie 2b (1993) cd1.srt
movie 3 (2019).avi
movie 1942 (2012).mkv
我想将它们移动到另一个文件夹中,该文件夹包含按年份划分的文件夹结构,每个文件夹中都有正确的电影。如果有一个子文件夹,如电影 2b,我不介意删除或保留该文件夹 - 只要输入正确的年份,哪种方式都更容易。源和目标位于同一分区,因此我宁愿使用 mv 而不是 rsync。
Sorted
1962
1993
2012
2019
根据论坛中的另一个问题/答案,我了解到了这一点,但我知道这是错误的,因为我不知道如何从年份中去掉括号,也不知道如何指定源文件夹和目标文件夹。
for f in *.*; do
if [ -f "$f" ] # does file exist?
then
dir=$(echo "$f" | grep -o "([0-9][0-9][0-9][0-9])" | head -1)
if [ "$dir" ] # check if string found
then
mkdir -p "$dir" # create dir
mv "$f" "$dir" # move file into new dir
else
echo "INCORRECT FILE FORMAT: \""$f"\"" # print error if file format is unexpected
fi
fi
done
有什么建议么?
答案1
使用 BASH_REMATCH 反向引用匹配的子表达式:
#!/bin/bash
for i in movies/*; do
if [[ $i =~ \(([0-9]{4})\) ]]; then
mkdir -p year/${BASH_REMATCH[1]}
mv -t year/${BASH_REMATCH[1]} "$i"
else
echo "Sort panic!"
fi
done