递归地从文件名中删除一些字符

递归地从文件名中删除一些字符

我的文件夹和子文件夹中有很多文件。

我需要从所有文件名中删除一些字符(相同位置)。

例子:

IMG-20230226-WA0002.jpg -> 20230226-WA0002.jpg

我认为简单的方法是使用echo ${i:N:N},所以我这样做了。

for i in $(find . -type f); do mv "$i" "${i:5}; done

正如我所想,它向我显示了带有完整路径的文件,那么我怎样才能正确地做到这一点呢?

PS:我该如何为“字符串”做到这一点?例如,仅从IMG-文件中删除字符串?

PS2:我不想使用rename命令。

谢谢。

答案1

像这样:

find . -type f -regextype egrep \
    -regex '.*/[[:alnum:]-]{7,}.*\.jpg$' -execdir bash -c '
        for file; do echo mv "$file" "${file:7}"; done
' bash {} +

我添加了2: 5+2 = 7,因为该文件以./.

对于字符串:

find . -type f -name '*.jpg' -execdir bash -c '
    for file; do echo mv "$file" "${file#./IMG-}"; done
' bash {} +

或使用globstar递归:

shopt -s globstar

for file in **/*.jpg; do
   ( cd "$(dirname "$file")" && echo mv "$file" "${file#IMG-}" )
done

echo如果您对输出满意,请删除语句。


如果你改变你的想法珀尔的rename:

rename -n -d 's/.*/substr($&, 5)/e' ./**/*.jpg
rename -n -d 's/^IMG-//' ./**/*.jpg

消除-n开关,又名试运行当你的尝试令人满意时重命名为真实的

-d开关仅重命名文件并丢弃文件路径。


find在当前文件的目录中为每个匹配执行-execdira 操作。cd


不要使用for循环来迭代find以防止 shell分词

答案2

看看这个mmv工具。它应该存在于任何现代发行版中,并且可以完全满足您的要求。

这里的例子是

mmv 'IMG-*.jpg' '#1.jpg'

要删除前 4 个字符:

mmv '????*.jpg' '#5.jpg'

相关内容