2017-02-09 29 views
0

重命名在Linux我有以下結構的文件夾:多和遞歸文件在bash

. 
├── a 
│   ├── 00000400000000030bfd.dat 
│   ├── 10000400000000030bfd.dat 
│   ├── 20000400000000030bfd.dat 
│   ├── etc.... 
├── b 
│   ├── 00000401000000030bfd.dat 
│   ├── 10000401000000030bfd.dat 
│   ├── 20000401000000030bfd.dat 
│   ├── etc.... 
├── c 
│   ├── 00000402000000030bfd.dat 
│   ├── 10000402000000030bfd.dat 
│   ├── 20000402000000030bfd.dat 
│   ├── etc.... 
├── d 
│   ├── etc.... 
├── e 
│   ├── etc.... 
├── f 

依此類推,直到"p"文件夾。我想將每個目錄中的每個.dat文件重命名爲.html文件,並將其與bash腳本重命名。我怎麼能做到這一點?

+0

你爲自己嘗試了什麼?你是怎麼失敗的? – Inian

+0

我試過用'in'ls -lR'do mv $ i $ i.html; done'和其他組合 – FelixFrog

回答

2

使用循環。

for file in {a..p}/*.dat ; do 
    mv "$file" "${file%.dat}.html" 
done 

${file%.dat}$file的值的末尾去除.dat

+0

在[a-p]/*。dat'文件中的單循環結束?甚至可以使用'{a..p}/*。dat'來避免區域設置問題。 –

+0

對不起,只是看到你實際提到這一點。我認爲for循環最大限度地免除了命令行長度:'touch {000001..1000000}'給出「參數列表太長」; '爲{000001..1000000}中的f;確實觸摸$ f;完成'工作正常。 –

+0

@BenjaminW:好的,已更新。實際上,內部命令和關鍵字在外部命令上似乎有所區別。 – choroba

0

下面是一個使用所有傳統命令的版本:

find log -name "*.dat" | 
    sed 's/.log$//;s/mv &.dat &.html/' | 
    bash 

從本質上講,find創建目標名單中,sed使名稱通用,然後生成一個mv命令不重命名,然後管道結果以bash執行。

可以省略bash命令以僅獲取用於眼球測試的mv命令的列表。您還可以將-x添加到bash命令中,以獲取每個執行的mv命令的日誌。