通过添加“循环”后缀来重命名文件

Phi*_*e P 5 command-line bash mv

我有一个包含子目录的目录,其中包含许多名为:

file1.tif
file2.tif
file3.tif
file4.tif
file5.tif
file6.tif
file7.tif...
Run Code Online (Sandbox Code Playgroud)

我想添加一个“循环”后缀c1,c2c3, 以获取文件名:

file1c1.tif
file2c2.tif
file3c3.tif
file4c1.tif
file5c2.tif
file6c3.tif
file7c1.tif...
Run Code Online (Sandbox Code Playgroud)

这在顶级目录的所有子目录中。

但我不知道如何做到这一点。

那可能吗?如何?

ste*_*ver 7

使用find+ 基于 perl prename(又名rename在一些早期的 Ubuntus 上),您可以匹配文字之前的数字序列,.然后使用模除法将其写入所需的格式,例如

find . -name '*.tif' -execdir prename -vn -- 's/(\d+)\./sprintf "%dc%d.", $1, ($1-1)%3+1/e' {} +
Run Code Online (Sandbox Code Playgroud)

(这些-vn标志允许您进行“试运行”以查看在提交之前如何重命名文件)。


前任。给予

$ tree
.
??? bar
?   ??? file1.tif
?   ??? file2.tif
?   ??? file3.tif
?   ??? file4.tif
?   ??? file5.tif
?   ??? file6.tif
?   ??? file7.tif
??? foo
?   ??? egg
?   ?   ??? file1.tif
?   ?   ??? file2.tif
?   ??? file1.tif
?   ??? file2.tif
?   ??? file3.tif
??? spam
    ??? file1.tif
    ??? file2.tif

4 directories, 14 files
Run Code Online (Sandbox Code Playgroud)

然后

find . -name '*.tif' -execdir prename -- 's/(\d+)\./sprintf "%dc%d.", $1, ($1-1)%3+1/e' {} +
Run Code Online (Sandbox Code Playgroud)

结果是

$ tree
.
??? bar
?   ??? file1c1.tif
?   ??? file2c2.tif
?   ??? file3c3.tif
?   ??? file4c1.tif
?   ??? file5c2.tif
?   ??? file6c3.tif
?   ??? file7c1.tif
??? foo
?   ??? egg
?   ?   ??? file1c1.tif
?   ?   ??? file2c2.tif
?   ??? file1c1.tif
?   ??? file2c2.tif
?   ??? file3c3.tif
??? spam
    ??? file1c1.tif
    ??? file2c2.tif

4 directories, 14 files
Run Code Online (Sandbox Code Playgroud)


hee*_*ayl 6

根据评论编辑:

如果要循环计数器即<number>c<number>1 到 3 之间循环:

试运行:

shopt -s globstar
for d in **/*/; do 
    ( cd "$d" && pwd && count=1 && shopt -s nullglob && for f in file*.tif; do 
        echo mv -i "$f" "${f%.tif}"c${count}.tif
        if ((count=3)); then 
            count=1
        else
            ((count++))
        fi
     done ) 
done
Run Code Online (Sandbox Code Playgroud)

行动:

shopt -s globstar
for d in **/*/; do 
    ( cd "$d" && count=1 && shopt -s nullglob && for f in file*.tif; do 
        mv -i "$f" "${f%.tif}"c${count}.tif
        if ((count=3)); then 
            count=1
        else
            ((count++))
        fi
     done ) 
done
Run Code Online (Sandbox Code Playgroud)

例子:

$ tree
.
??? bar
?   ??? file1.tif
?   ??? file2.tif
?   ??? file3.tif
?   ??? file4.tif
??? foo
?   ??? egg
?   ?   ??? file1.tif
?   ?   ??? file2.tif
?   ??? file1.tif
?   ??? file2.tif
?   ??? file3.tif
??? spam
    ??? file1.tif
    ??? file2.tif

$ shopt -s globstar
$ for d in **/*/; do ( cd "$d" && pwd && count=1 && shopt -s nullglob && for f in file*.tif; do \
    echo mv -i "$f" "${f%.tif}"c${count}.tif; if ((count=3)); then count=1; else ((count++)); fi; done ); done
/home/foobar/bar
mv -i file1.tif file1c1.tif
mv -i file2.tif file2c2.tif
mv -i file3.tif file3c3.tif
mv -i file4.tif file4c1.tif
/home/foobar/foo
mv -i file1.tif file1c1.tif
mv -i file2.tif file2c2.tif
mv -i file3.tif file3c3.tif
/home/foobar/foo/egg
mv -i file1.tif file1c1.tif
mv -i file2.tif file2c2.tif
/home/foobar/spam
mv -i file1.tif file1c1.tif
mv -i file2.tif file2c2.tif

$ for d in **/*/; do ( cd "$d" && count=1 && shopt -s nullglob && for f in file*.tif; do \
    mv -i "$f" "${f%.tif}"c${count}.tif; if ((count=3)); then count=1; else ((count++)); fi; done ); done

$ tree
.
??? bar
?   ??? file1c1.tif
?   ??? file2c2.tif
?   ??? file3c3.tif
?   ??? file4c1.tif
??? foo
?   ??? egg
?   ?   ??? file1c1.tif
?   ?   ??? file2c2.tif
?   ??? file1c1.tif
?   ??? file2c2.tif
?   ??? file3c3.tif
??? spam
    ??? file1c1.tif
    ??? file2c2.tif
Run Code Online (Sandbox Code Playgroud)

原答案:

bash

shopt -s globstar
for d in **/*/; do ( cd "$d" && pwd && count=1 && shopt -s nullglob \
    && for f in file*.tif; do echo mv -i "$f" "${f%.tif}"c${count}.tif; \
        ((count++)); done ); done
Run Code Online (Sandbox Code Playgroud)
  • 这里我们循环遍历目录名,globstarshell 选项让我们递归遍历目录

  • 里面的部分在()子shell中运行,这是为了防止cd在当前shell中被修改

  • 我们正在cd进入目录,查找file*.tif文件并根据需要重命名它们

  • count重命名时为每个文件保留一个递增计数器


以上是试运行,将向您显示将要进行重命名的目录以及mv将运行什么命令。如果满意,请执行:

shopt -s globstar
for d in **/*/; do ( cd "$d" && count=1 && shopt -s nullglob && \
  for f in file*.tif; do mv -i "$f" "${f%.tif}"c${count}.tif; ((count++)); done ); done
Run Code Online (Sandbox Code Playgroud)

有一个警告,因为 shell 进行词法排序,所以文件 egfile10.tif将早于file2.tif. 如果您不希望那样,请在重命名或使用zshwithnumericglobsort选项之前进行一些排序。