2012-06-29 31 views
0

我想重命名文件的負載(我計數超過200),或者在文件名或文本內容中具有公司名稱。我基本上需要將任何對「公司」的引用更改爲「新公司」,在適用的情況下(即「公司變成新公司」,「公司」變成「新公司」)維持資本化。我需要遞歸執行此操作。如何重命名大量文件,在Linux中爲每個文件改變相同的文件名元素?

因爲這個名字可能出現在任何地方,所以我一直無法找到滿足我需求的示例代碼。它可以是這些例子中的任何一個或更多:

company.jpg 
company.php 
company.Class.php 
company.Company.php 
companysomething.jpg 

希望你能明白。我不僅需要使用文件名來執行此操作,還需要使用HTML和PHP腳本等文本文件的內容。我假設這將是第二個命令,但我不完全確定是什麼。

我搜索代碼庫,發現近2000年的近300文件中提到的公司名稱,所以我不喜歡做手工。

請幫忙! :)

+0

改名和刪除遞歸。這不是關於遞歸(所有多個操作都不是遞歸!),這是關於 - 看到新的標題。 –

+0

對不起,看起來,當谷歌搜索問題很多人都問同樣的問題。它以遞歸方式遍歷所有目錄,就像chmod -R或chown -R一樣,所以它看起來像是一個明顯的標題。這些文件不是全部​​在同一個目錄中,但它們全都在這個目錄或子目錄中 –

回答

1

bash具有強大的循環和替代功能:

for filename in `find /root/of/where/files/are -name *company*`; do 
    mv $filename ${filename/company/newcompany} 
done 
for filename in `find /root/of/where/files/are -name *Company*`; do 
    mv $filename ${filename/Company/Newcompany} 
done 
+0

我可能以某種方式做了一個散列,不確定。我得到這個: 語法錯誤附近意想不到的令牌'mv' –

+0

我錯過了';',現在修正了 –

+0

魔法!這樣可行。現在我只需要對引用公司和公司的文件內容進行排序。那個簡單而有效的,謝謝 –

1

我建議你看一看man rename一個非常強大的Perl的效用,那麼,重命名文件。

標準語法是

rename 's/\.htm$/\.html/' *.htm 

巧妙的部分是工具接受任何Perl的正則表達式爲圖案爲一個文件名被改變。

你可能要與 -n開關,這將使該工具只報告它會改變運行

無法找出一個很好的方法來保持現在的大小寫,但由於您已經可以搜索文件結構,因此可以使用不同的大寫字母發佈幾個rename,直到所有文件發生更改。

要遍歷當前文件夾下的所有文件,並搜索特定的字符串,可以使用

find . -type f -exec grep -n -i STRING_TO_SEARCH_FOR /dev/null {} \; 

從該命令的輸出可以被定向到一個文件中(經過一番過濾,只提取文件需要更改的文件的名稱)。

find . /type ... > files_to_operate_on 

然後包裹在一個while read循環和就地更換

while read file 
do 
    perl -pi -e 's/stringtoreplace/replacementstring/g' $file 
done < files_to_operate_on 
1

對於文件名和目錄名做一些Perl的魔法,使用forfindmvsed

對於在名稱具有company每個路徑(f),從f將其重命名(mv)到companynewcompany更換的新名稱。

for f in `find -name '*company*'` ; do mv "$f" "`echo $f | sed s/company/nemcompany/`" ; done 

對於文件的內容,使用findxargssed

對於每個文件,在其內容中將company改爲newcompany,保留原文件的擴展名爲.backup

find -type f -print0 | xargs -0 sed -i .bakup 's/company/newcompany/g' 
0

有遞歸處理文件數正確的方法。這裏有一個:

while IFS= read -d $'\0' -r file ; do 
    newfile="${file//Company/Newcompany}" 
    newfile="${newfile//company/newcompany}" 
    mv -f "$file" "$newfile" 
done < <(find /basedir/ -iname '*company*' -print0) 

這將適用於所有可能的文件名,而不是沒有空白的文件名。

設定bash。

對於更改文件的內容,我會建議小心,因爲如果文件不是純文本,文件中的盲目替換可能會破壞文件。也就是說,sed就是爲了這樣的事情而製作的。

while IFS= read -d $'\0' -r file ; do 
    sed -i '' -e 's/Company/Newcompany/g;s/company/newcompany/g'"$file" 
done < <(find /basedir/ -iname '*company*' -print0) 

就該運行而言,我建議增加一些額外的開關find限制,將處理的文件,或許

find /basedir/ \(-iname '*company*' -and \(-iname '*.txt' -or -ianem '*.html' \) \) -print0 
+0

謝謝。我使用了我在其他地方找到的sed解決方案,但它似乎只替換了第一個匹配項。必須保持運行或手動完成。儘管對我來說最多,但這很好:)這是命令:find ./ -type f -exec sed -i's/company/newcompany /'{} \; –

+0

@AntTheKnee:'sed'的///表達式只會替換第一個實例。您需要添加'g'(「全局」)選項以使其每行替換多個實例,例如,就像你在我的例子中看到的那樣。 – Sorpigal

+0

很高興知道。非常感謝 :) –

相關問題