我的文件夹和子文件夹中有很多文件。
我需要从所有文件名中删除一些字符(相同位置)。
例子:
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
在当前文件的目录中为每个匹配执行-execdir
a 操作。cd
不要使用for
循环来迭代find
以防止 shell分词。
答案2
看看这个mmv
工具。它应该存在于任何现代发行版中,并且可以完全满足您的要求。
这里的例子是
mmv 'IMG-*.jpg' '#1.jpg'
要删除前 4 个字符:
mmv '????*.jpg' '#5.jpg'