2011-12-07 34 views
39

Shell/Bash中是否有一個快捷方式可以根據正則表達式或其他條件重命名文件夾中的所有文件。我找的這裏是我的文件夾中的文件,已經讓我們說有以下命名約定100個的文本文件:Shell/Bash快捷方式批量重命名文件夾中的文件

<longdocumentidentifier>-doc-<counter>.txt. 

我需要重命名所有與上面給出的約定,只是將文件:

doc-<counter>.txt 

有沒有一種方法可以幫助我解決上述問題?

回答

76

我建議是這樣的:

for i in *-doc-*.txt; do mv $i ${i/*-doc-/doc-}; done 

${i/*-doc-/doc-}doc-代替第一次出現*-doc-

如果您需要做多個替換(請參閱註釋編號1),則需要使用${var//Pattern/Replacement}變體。如果您需要替換名稱的開頭,則需要使用,如果需要替換結尾(即:擴展名),則需要使用${var/%Pattern/Replacement}表單。

更多細節

+2

這對稍微不同的情況有幫助;我想用一些破折號替換一些文件名中的所有空格:'for in in *;做mv「$我」$ {我// \/- }; done'。請注意,爲了這個工作,我不得不引用原始文件名稱。 –

+0

我用它從所有腳本名稱中刪除了.sh :-)'for i in * .sh;做mv $ i $ {i/.sh /}; done'。 – erm3nda

+0

@ erm3nda注意:'$ {i/.sh /}'會刪除.sh字符串的第一個匹配項。爲了確保你刪除了擴展名(我假設你想要的),你應該使用'$ {i /%。sh /}' – Sorin

8

內置在大多數linux中的重命名命令,例如,將很容易地做到這一點。

就個人而言,我更喜歡正則表達式太這就是爲什麼我一直在圍繞這個腳本攜帶一個非常非常非常長的時間(讀:80年代末期以來或90年代初):

#!/usr/bin/perl 

($op = shift) || die "Usage: $0 expr [files]]\n"; 

if([email protected]) 
    { 
    @ARGV = <STDIN>; 
    chop(@ARGV); 
    } 

for (@ARGV) 
    { 
    $was = $_; 
    eval $op; 
    die [email protected] if [email protected]; 

    if ($was ne $_) 
    { 
    print "rename($was,$_)\n"; 
    rename($was,$_); 
    } 
    } 

,當安裝可以讓你做這樣的事情:

script-name 's/.*-doc(.*).txt/doc$1.txt/' *.txt 
12

prenamehttp://tldp.org/LDP/abs/html/parameter-substitution.html#EXPREPL1,允許你使用正則表達式:

prename 's/^.*-doc-(.*\.txt)$/doc-$1/' *.txt 

使用該選項-n模擬:

prename -n 's/^.*-doc-(.*\.txt)$/doc-$1/' *.txt 

注:這在許多Linux發行版中以rename的形式發貨,但不是所有的 - 所以我使用Perl自帶的實用程序的規範名稱。

+4

downvoter:care to comment? – elias

18

如果你有rename那麼,rename 's/^.*-doc-/doc-/' *.txt應該做的伎倆。

3
mmv "*-doc-*" "doc-#2" 

MMV命令代表「大衆搬家」

5

如果你想遞歸到子目錄,還有:

find . -maxdepth N -type f -name "$pattern" | sed -e 'p' -E -e "s/$str1/$str2/g" | xargs -n2 mv 

在系統,可自動支持擴展的正則表達式,你可以離開-E

優點:

  • 遞歸進入子目錄
  • 可以控制遞歸的MAXDEPTH
  • 可以重命名文件和/或目錄(型的F | d)

缺點:

  • slightl Ÿ更復雜的正則表達式,因爲你必須剝離出路徑獲得的文件名

(回答來自here修訂)

3

如果你不介意的外部工具,那麼這裏有一個:rnmweb page

爲您的特定問題的命令是:

rnm -rs '/.*-doc-/doc-/' *.txt 

或者

rnm -rs '/.*-(doc-.*\.txt)/\1/' *.txt 

你可以找到更多的例子/文檔here

0

找到。 -name'* scss'| xargs -L1 -I {} echo {} {} | sed's/css.scss $/scss /'| xargs的-L1 MV

例如,如果你有一堆與「.css.scss」結尾的文件,你想重新命名他們只是「.scss」結束(即刪除的CSS部分)

調整正則表達式並找到您需要的參數