2013-01-13 181 views
12

我有這樣的事情:在多個目錄中的文件重命名爲目錄名

v_1/file.txt 
v_2/file.txt 
v_3/file.txt 
... 

,我想這些文件重命名爲這樣的事情:在同一目錄

v_1.txt 
v_2.txt 
v_3.txt 
... 

我想我可以使用rename但我無法弄清楚如何將它與文件夾和文件重命名同時使用。

回答

19

結果可以與循環和mv一個bash實現空間。相關link

基於註釋的另一解決方案(即具有在命名空間以及目錄的工作):

find . -type d -not -empty -exec echo mv \{\}/file.txt \{\}.txt \; 
+0

的情況下,似乎不夠好 – giskou

+0

'$ subdir'應該是'「$子目錄」' 和去除空文件夾 '找到。型d -empty -exec室射頻\ {\} \;' – giskou

+0

@giskou如果你喜歡打字。一個單獨的#/ file ##'重命名可以更容易輸入,並且處於正確的抽象級別。重複相同的shell循環來重命名文件變得老舊。 – tchrist

1

似乎很簡單的對我說:

for subdir in *; do mv $subdir/file.txt $subdir.txt; done; 

注意的是,上述解決方案將無法工作,如果目錄名稱包含:

$ mkdir /tmp/sandbox 
$ cd /tmp/sandbox 

$ mkdir v_{1,2,3} 
$ touch v_{1,2,3}/file.txt 

$ rename -v 's#/file##' v_{1,2,3}/file.txt 
rename v_1/file.txt v_1.txt 
rename v_2/file.txt v_2.txt 
rename v_3/file.txt v_3.txt 

$ ls -F 
v_1/ v_1.txt v_2/ v_2.txt v_3/ v_3.txt 
+2

的子文件夾是大約130,而不僅僅是3:P – giskou

+0

@giskou我不明白爲什麼這很重要:我只是證明該技術的原理。子目錄的數目並不重要,除非你打'xargs'限制,甚至認爲是因爲Perl的'rename'將在標準輸入讀取文件名瑣碎。 – tchrist

+0

我比bash和regexps更受歡迎。如果你能解釋一下你的詳細技術......我真的不知道那是什麼:P – giskou

1

您可以使用rnm。該命令將是:

rnm -fo -dp -1 -ns '/pd0/.txt' -ss '\.txt$' /path/to/the/directory 

-fo意味着文件唯一模式。

-dp目錄深度。 -1使其對所有子目錄遞歸。

-ns意味着名稱字符串,即文件的新名稱。

/pd0/是受重命名操作的文件的直接父目錄。

-ss是一個搜索字符串(正則表達式)。 '\.txt$'正則表達式搜索的文件名末尾帶.txt文件。

/path/to/the/directory這是v_1,v_2 ...目錄所在的路徑。您也可以傳遞目錄(v_1,v_2 ...)來代替父目錄路徑。例如:

#from inside the parent directory 
rnm -fo -dp -1 -ns '/pd0/.txt' -ss '\.txt$' v_*