我有一个随机数量的文件,名称为:
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的新手,对此事的任何帮助都将不胜感激。
由于
答案 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'
),并输出文件路径的行。输出通过pipe与while
循环相关联。这意味着循环连接到管道的另一侧,并逐行读取路径。
${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
在对实际文件运行之前,先在测试文件夹中进行干运行。