在Bash

时间:2016-11-17 11:51:25

标签: linux bash

我有一个随机数量的文件,名称为:

id_1000.txt
id_2000.txt
id_3000.txt
id_4000.txt

请注意,.txt个文件的数量因目录不同而异。例如,一个目录可能只包含一个id_1000.txt(至少),或者可能包含任意数量的任何数字的文件。

要转换系统增量编号中的随机数量的文件名,我在批处理脚本中使用了以下脚本

setlocal enabledelayedexpansion
set /a count=1
for /f "tokens=*" %%a in ('dir /b /od *.txt') do (
 echo ren "%%a" "id_!count!.txt"
 set /a count+=1
)

上述输入的输出为:

ren "id_1000.txt" "id_1.txt"
ren "id_2000.txt" "id_2.txt"
ren "id_3000.txt" "id_3.txt"
ren "id_4000.txt" "id_4.txt"

它首先检测当前目录中有id_*.txt个文件的数量,然后使用正常的计数顺序更改为更高的数字:1,2,3,4等,并回显一行。< / p>

虽然我试图为Ubuntu搜索替代命令,但我找不到任何令人满意的结果。

我是Linux shell的新手,对此事的任何帮助都将不胜感激。

由于

3 个答案:

答案 0 :(得分:2)

shopt -s globstar
n=0
for a in **/*.txt; do 
        ((n++))
        mv "$a" id_$n.txt
done    

答案 1 :(得分:1)

假设您有以下文件系统布局:

Dir
├── A
│   ├── id_1000.txt
│   ├── id_2000.txt
│   ├── id_3000.txt
│   └── id_4000.txt
├── id_5000.txt
├── id_6000.txt
├── id_7000.txt
└── id_8000.txt

然后您可以使用类似于以下内容的脚本:

let i=1
find "./Dir" -type f -regex '.*id_[0-9]+\.txt' | while read file
do
  mv "$file" "${file/%id_*.txt/id_$i}.txt"
  (( ++i ))
done

该脚本将按如下方式重命名文件:

Dir
├── A
│   ├── id_1.txt
│   ├── id_2.txt
│   ├── id_3.txt
│   └── id_4.txt
├── id_5.txt
├── id_6.txt
├── id_7.txt
└── id_8.txt

let builtin用于算术表达式。在上面的脚本中,我们使用值i初始化了1变量。

find命令搜索与regular expression -type f匹配的目录./Dir中的文件('.*id_[0-9]+\.txt'),并输出文件路径的行。输出通过pipewhile循环相关联。这意味着循环连接到管道的另一侧,并逐行读取路径。

${file/%id_*.txt/id_$i}的{​​{1}}表达式substitutes id_$i

下一行(id_*.txt)是一个递增(( ++i ))变量的算术表达式。

注意,如果您想将脚本的效果限制在某个目录级别,请使用i的{​​{1}}选项。

答案 2 :(得分:0)

如果文件采用您在问题中提供的格式,则应该有效 -

#Get the number of .txt. files to be renamed    
    num=$(ls id_*.txt | wc -l) 
#Rename them
    for i in $(seq 1 "$num")
    do
        mv id_"$num"000.txt id_"$num".txt
    done

在对实际文件运行之前,先在测试文件夹中进行干运行。