yae*_*ael 2 bash find shell-script rename
在以下当前文件夹下,我们有文件示例
lok.log.1
df.log.6
weq.log.90
vr.log.11
vs.aw.frsd.log.3
Run Code Online (Sandbox Code Playgroud)
我们想将文件扩展名增加 1
所以预期的输出将如下
lok.log.2
df.log.7
weq.log.91
vr.log.12
vs.aw.frsd.log.4
Run Code Online (Sandbox Code Playgroud)
请建议如何使用查找和正则表达式重命名文件
与zsh:
autoload zmv # best in ~/.zshrc
zmv -n -f '(*.log.)(<->)(#qnOn)' '$1$(($2+1))'
Run Code Online (Sandbox Code Playgroud)
(删除-n如果对结果满意)
<-> 匹配任何十进制数(#qnOn): glob 限定符在这里按数字 ( n) 按名称 ( On)以相反的顺序对文件列表进行排序,因此file.log.2重命名为file.log.3之前file.log.1重命名为file.log.2. 添加.如果要重命名只是普通的文件(但你可能会想添加一个-o-nT选项假设GNU mv)和D,如果你也想重命名文件隐藏。-f禁止将取消命令时,文件将被重命名为现有的文件,该文件将得到我们的方式的保障file.log.1,file.log.2例如上面。它仍然将防范都foo.log.1和foo.log.01被重命名为foo.log.2。递归地:
zmv -n -f '(**/)(*.log.)(<->)(#qnOn)' '$1$2$(($3+1))'
Run Code Online (Sandbox Code Playgroud)
从bash或sh或ksh:
zsh << 'EOF'
autoload zmv
zmv -n -f '(*.log.)(<->)(#qnOn)' '$1$(($2+1))'
EOF
Run Code Online (Sandbox Code Playgroud)
使用bash和不使用zsh,如果你有 GNUls和 GNU mv,并且文件列表不是太大,你可以做一些接近的事情:
shopt -s failglob
shopt -s extglob
export LC_ALL=C
eval "files=($(
ls --quoting-style=shell-always -rvd -- *.log.+([[:digit:]])))"
for f in "${files[@]}"; do
echo mv -nT -- "$f" "${f%.*}.$((10#${f##*.} + 1))"
done
Run Code Online (Sandbox Code Playgroud)
(echo满意后删除)。
递归地,对于 GNU bash、 GNU find、 GNUmv和 GNU sort,仅用于常规文件:
export LC_ALL=C
while IFS= read -rd '' -u3 file; do
echo mv -nT "$file" "${file%.*}.$((10#${file##*.} + 1))"
done 3< <(
find . -name '.?*' -prune -o -regex '.*\.log\.[0-9]+' -type f -print0 |
sort -rzV)
Run Code Online (Sandbox Code Playgroud)
mv -n是一个 GNU 扩展,以避免破坏现有文件,并-T消除移动到和移动之间的歧义,mv否则会受到影响。但是请注意,当文件因 未重命名时-n,您不会收到任何关于此的错误。
| 归档时间: |
|
| 查看次数: |
141 次 |
| 最近记录: |