2015-07-20 526 views
2

我試圖批量重命名PDF文件以從右向左移除所有字符,直到在Mac OS上達到數字字符。在Mac上批量重命名文件正則表達式

例如:

10002ASmith.pdf> 10002.pdf

1023AJones.pdf> 1023.pdf

中的文件的開頭的數字長度是可變的,所以我圖將是​​最好的將正則表達式從右向左重命名,直到達到數字。

我知道Mac Yosemite附帶批量重命名功能,但沒有看到正則表達式重命名選項。是否容易在終端中執行此操作,如果是這樣,還是有免費的程序可用於使用正則表達式?

我想我只需要知道實際的正則表達式會是什麼,因爲我在正則表達式方面經驗不足。

感謝您提前幫忙!

喬恩

回答

1

您可以使用此findsed

cd to /path/of/pdfs 

while IFS= read -rd '' line; do 
    echo mv "$line" $(sed 's~\./[a-zA-Z]*\([0-9]*[a-zA-Z]\).*\(\.pdf\)$~\1\2~' <<< "$line") 
done < <(find . -maxdepth 1 -regex '\./[a-zA-Z]*[0-9]*[a-zA-Z]\{1,\}\.pdf$' -print0) 

刪除echo你確認這是工作後。

+0

呃,你在'find'中使用'-print0'謂詞,但之後不處理,所以這個命令不起作用。 – werkritter

+1

你說得對,我站好了。但是你確定它確實是'IFS ='嗎?我嘗試'閱讀'沒有'IFS =',但'-d'''選項,它確實工作。 – werkritter

+0

你能否提供一個需要'IFS ='的情況?我運行了下面的命令,在目錄中有'.pdf'文件,其中包含空格:'find。 -maxdepth 1 -name'* .pdf'-print0 |同時讀-d''行;做echo $ line;完成「,並在單獨的行上打印整個文件名。所以不適合引用就足夠了? – werkritter

0

我會建議在shell中使用findsed,但以@anubhava提出的更簡單的方式。但是請注意,如果文件中有空格,它將不起作用。處理空白的版本會稍微複雜一些。

find . -maxdepth 1 -name '*.pdf' | while read filename; do newfilename=`echo $filename | sed '/[0-9]/s/[^0-9]*\.pdf/.pdf/'`; echo mv $filename $newfilename; done 

說明:

  • find . -maxdepth 1 -name '*.pdf' - 打印在當前目錄下的所有文件.pdf;
  • while read filename; do + done - 將從find結果(將行保存在filename變量中)的每一行上運行的循環;
  • /[0-9]/s/[^0-9]*\.pdf/.pdf/ - 這是「業務」部分。它由正則表達式地址/[0-9]/(表示「僅對包含數字的文件名應用以下命令」)和s命令組成;
  • s表達式本身s/[^0-9]*\.pdf$/.pdf/意思是「儘量找到非數字字符,然後用.pdf和名稱的結尾,並將其更改爲.pdf」;
  • 命令替換讓我們創建newfilename內容。

流水線會將建議的命令回顯給終端。如果你對結果滿意,你可以,如果你使用bash與管道輸出到shell命令重新運行它,例如

find . -maxdepth 1 -name '*.pdf' | while read filename; do newfilename=`echo $filename | sed '/[0-9]/s/[^0-9]*\.pdf/.pdf/'`; echo mv $filename $newfilename; done | bash 

+1

謝謝你的解釋@werkritter! – Jibes