改善保罗的回答:

改善保罗的回答:

所以这是当前路径:

../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 {} \;

可以这样优化(没有任何findfor循环):

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:全部确认( )。

相关内容