2013-03-05 39 views
0

設計bash腳本我必須做一個簡單的設計,但我不知道該怎麼辦呢用於提取未知的文件名部分

我有兩個文件夾folderA和文件夾B. folderA的裏面我有一個名爲兩個文件「file_」和「file_anything」。第二個文件的「任何」部分是我不知道的一些文本(或者對於各種文件夾可能不同)。我需要做的是將folderB的名稱更改爲任何文字爲「任何東西」,而無需特別瞭解

如果超出了程序,我會感到欣慰的是有人給我一個鏈接,指向您用來理解和能夠修改或適應其他情況的solutuions。我想學習

感謝

編輯: 我需要這個解決方案將包括在要被重複了很多具有相同estructure文件夾的夫婦bash腳本(無Perl函數)內。例如:

FolderA(與文件 「_文件」 和 「file_manana」)和FolderB中---變化---> FolderA和晨報(原FolderB中)

FolderC(與文件 「_文件」 和「 File_monkey「)和FolderD ---更改爲---> FolderA和Monkey(前FolderD)

FolderE(帶有文件」file_「和」file_moose「)和FolderF ---更改爲---> FolderA和駝鹿(原FolderF)

很多很多次多了很多文件夾

埃德它2:

好吧,我越來越近。現在的問題是這樣的:我這樣定義fn:fn = file_a *知道該文件夾中只有一個與該指令相匹配的文件。我確認這樣做echo $ fn。現在我這樣做:fn = $ {fn ## * _}。但是,fn不會變成「任何東西」,而是變成「a *」。我該如何解決這個問題? @David Zaslavsky

編輯3:Thx @chepner。 BASH_REMATCH是要走的路。我用它一點點的改變,因爲你寫的方式didin't爲我工作

for f in FolderA/file_*; do # I assume a single match 
[[ $f =~ "file_"(.*) ]] 
suffix=${BASH_REMATCH[1]} 
mv FolderB "$suffix" 
done 

注意引號。他們之間,我甚至可以包含空格

THX大家

+0

我不確定要理解你的問題,但我認爲'rename' cmd可以幫助你。你只給出一個'ed'命令來重命名文件。例如:'s/file _ //'刪除這部分。 – Zulu 2013-03-05 22:30:18

回答

0

我不太明白你的最終結果應該是什麼,但你可以用下面的提取file_anything後部分:

$ f="file_manana" 
$ [[ $f =~ file_(.*) ]] 
$ suffix=${BASH_REMATCH[1]} 
$ echo $suffix 
manana 

所以,我覺得你想要做的就是

for f in FolderA/file_*; do # I assume a single match 
    [[ $f =~ file_(.*) ]] 
    suffix=${BASH_REMATCH[1]} 
    mv FolderB "$suffix" 
done 
0

你要查找的Bash manual參數擴展。如果你在一個變量存儲file_anything的名字,讓我們說fn,您可以使用${fn##*_}刪除最長前綴從文件名匹配*_,然後你可以使用在mv命令重命名文件夾B.

+0

好吧,我越來越近了。現在的問題是這樣的:我這樣定義fn:fn = file_a *知道在那個地毯中只有一個文件與該指令相匹配。我確認這樣做echo $ fn。現在我這樣做:fn = $ {fn ## * _}。但是,fn不會變成「任何東西」,而是變成「a *」。我該如何解決這個問題? @David Zaslavsky – Tojur 2013-03-05 23:14:05

+1

請不要嘗試在評論部分優化您的問題定義。編輯您的問題以包含格式化的樣本輸入以及來自該輸入的所需輸出。祝你好運。 – shellter 2013-03-05 23:21:33

+0

@ user1620160什麼shellter說。你的評論正在問一些不同的東西;原始問題中沒有通配符。如果你可以提供一些實際的文件名,它可能會有所幫助。 – 2013-03-05 23:23:10