2011-10-07 102 views
5

我一直在嘗試編寫一個腳本,它將採用當前工作目錄,掃描每個文件並檢查它是否爲.txt文件。然後取出每個文件(這是一個文本文件),並檢查它的名稱中是否包含下劃線,以及是否將下劃線更改爲連字符。重命名UNIX目錄中的文件 - shell腳本

我知道,這是一個艱鉅的任務,但這裏是粗略的代碼,我到目前爲止有:

#!/bin/bash 
count=1 
while((count <= $#)) 
     do 
      case $count in 
       "*.txt") sed 's/_/-' $count 
      esac 
      ((count++)) 
done 

我當時的想法是,這將需要在當前工作目錄作爲參數的文件並檢查每個文件(由$ count或「count」處的文件表示)。然後對於每個文件,它會檢查它是否以.txt結尾,如果它確實會使用sed將每個下劃線更改爲連字符。我認爲我遇到的主要問題之一是腳本沒有從當前工作目錄讀取文件。我嘗試在運行腳本的命令之後包含目錄,但我認爲它需要每行而不是每個文件(因爲每行都有4個左右的文件)。

無論如何,任何幫助將不勝感激!另外,我很抱歉我的代碼非常糟糕,我對UNIX非常陌生。

+0

一個問題是'$ count'是變量'count'的值,它是一些整數。如果你想迭代位置參數,你可以這樣寫:'for file in「$ @」;做...或者簡寫'檔案;做...' –

+0

在這裏檢查:http://theunixshell.blogspot.com/2013/01/bulk-renaming-of-files-in-unix.html – Vijay

回答

0
 
$ ls *.txt | while read -r file; do echo $file | 
    grep > /dev/null _ && mv $file $(echo $file | tr _ -); done 

(未經測試)

+0

這將失敗的文件中包含空格的文件名。如果你做錯了'mv',你甚至可能會丟失一些數據。 –

+0

是的,它會在包含空格的文件上失敗。將空格放入文件名的用戶應該丟失所有數據。 :) –

+0

我有點同意... :-)然而,我們在這裏瞭解對方,這就是爲什麼我添加了這條評論。問候。 –

1

爲什麼不:

rename 's/_/-/' *.txt 
+0

'重命名:找不到命令'。問題是關於Unix,而不是特定的Linux發行版。但考慮到幾乎在任何地方都安裝了Perl,這是一個非常靈活的解決方案。 –

+2

@RolandIllig:我知道'rename'並不是無處不在,但是從shebang我認爲它是在一些現代的unix系統上執行的。 –

2
for fname in ./*_*.txt; do 
    new_fname=$(printf '%s' "$fname" | sed 's,_,-,') 
    mv "$fname" "$new_fname" 
done 
+2

如果shell是bash,可以這樣寫:'new_fname = $ {fname // _/- }' –

0

感謝您的所有輸入傢伙!總而言之,我想我找到了解決方案是最適合我的技術水平:

ls *.txt | while read -r file; do echo file | 
    mv $file $(echo $file | sed 's,_,-,'); 
done 

這有什麼,我需要做的,我的目的,我不是太擔心的空間。但是,謝謝你們所有的精彩建議,你們都非常聰明!