所以这是当前路径:
../CAMERA3/serialnum/2016-12-19/001/dav/07/07.02.53-07.03.14[M][0@0][0].dav
最终目标:
../CAMERA3/2016-12-19_07.02.53-07.03.14.dav
所以我基本上试图找出一个 for 循环来提取一些目录名和文件名的一部分,如下所示:
mv ../$dir1/$dir2/$dir3/$dir4/$dir5/$dir6/$filenameportion[M][0@0][0].dav ../$dir1/$dir3_$filenameportion.dav
答案1
最终不得不使用米。有点丑陋,但它有效:
find /mnt/test -name '*.dav' -exec sh -c 'for filename do
if [[ $(basename "$filename") != C*.dav ]];then
find "$filename" -type f -execdir ~/bin/rnm -y "$filename" -ns '/pd05/_/pd03/_/n/.dav' \;
fi
done' find-sh {} \;
find /mnt/test -name '*.dav' -exec sh -c 'for filename do
rename "[M][0@0][0]" "" "$filename"
done' find-sh {} \;
find /mnt/test -name '*.dav' -type f -execdir sh -c 'mv "$@" ./../../../../..' find-sh {} \;
PS:是的,我都是用户。我最初以访客身份发布,然后按照电子邮件链接创建了一个帐户。令人惊讶的是它不是自动的。很抱歉反斜杠混淆,将文件复制到 Windows 笔记本电脑,忘记更改回来以进行发布。
更新 1:删除了查找输出的循环
答案2
改善保罗的回答:
下面的代码:
find /mnt/test -name '*.dav' -exec sh -c 'for filename do
if [[ $(basename "$filename") != C*.dav ]];then
find "$filename" -type f -execdir ~/bin/rnm -y "$filename" -ns '/pd05/_/pd03/_/n/.dav' \;
fi
done' find-sh {} \;
可以这样优化(没有任何find
或for
循环):
rnm -y -ns '/pd5/_/pd3/_/n/.dav' -ss '^[^C].*\.dav$' -fo -dp -1 /mnt/test
解释:
-ss
:搜索字符串(正则表达式)。上面使用的正则表达式搜索以 结尾.dav
且不以 开头的文件C
。
-fo
:仅文件模式。
-dp
: 深度。-1
意味着无限深度,即转到所有子目录。
-ns
:名称字符串(新名称)
/pd<digit>/
:名称字符串规则,表示不同级别的父目录名称:0 是直接父目录,1 是上面的目录,依此类推。
/n/
:另一种名称字符串规则,表示不带扩展名的文件名。/n/.dav
可以替换为/fn/
(全名)。
-y
--yes
:全部确认( )。