簡體   English   中英

在命令行中使用perl批處理重命名文件

[英]perl batch rename files in command line

我想用文件名中的“ sr”重命名文件,將“ sr”替換為“ SR”。 這一成功:

ls | perl -e 'while(<>){chomp;if(/(.*)sr(.*)/){rename $_,$1."SR".$2}}'

但是這個失敗了:

ls | perl -e "while(<>){chomp;if(/sr/){rename $_,$\`.'SR'.($')}}"

出現此錯誤消息:

Not enough arguments for rename at -e line 1, near "rename ,"`
Execution of -e aborted due to compilation errors.

似乎$ _已成為一個空字符串,但是我不太明白為什么。 感謝您的任何解釋。

現在引號是一個有趣的問題,這是我的測試:

ls | perl -e "while(<>){chomp;if(/sr/){print $_;print\"\n\";print $\`,$&,($');print \"\n\";print $_,$\`,$&,($');print\"\n\";print $_;print\"\n\"}}"

輸出此:

3sr
3sr
3sr
3sr
sr1
sr1
sr1
sr1
sr2
sr2
sr2
sr2

似乎單獨使用時,$ _不是空的; 但是當與$`,$&和$'一起使用時,它變為空。 根據每個文件的最后一行,我猜$ _在不單獨使用時會暫時更改?

此外,根據a1111exe的答案,我對此進行了測試:

ls | perl -e "while(<>){chomp;if(/sr/){print \$_,$\`,$&,($');print \"\n\"}}"

並得到了:

3sr3sr
sr1sr1
sr2sr2

首先,在Linux中,我們應該使用單引號而不是雙引號。

代替ls命令,您可以使用perl內置函數glob

要捕獲之前和之后的比賽,您可以使用英語模塊中的$ POSTMATCH和$ PREMATCH

所以你的一支班輪應該是

perl -MEnglish -e 'while(<*>){chomp;if(/sr/){rename $_,$PREMATCH."SR".$POSTMATCH}}'

已編輯

單引號和雙引號與Perl無關,而與Shell有關。

單引號

將字符括在單引號(')中可保留引號內每個字符的字面值。 即使在單引號之前加反斜杠,也不能在單引號之間引起單引號。

雙引號

將字符括在雙引號('“')中可保留引號內所有字符的字面值,但'$','`','\\'除外,並且在啟用歷史記錄擴展時為'!'。

在shell腳本,我們訪問的shell變量前綴$ ,所以在使用$雙引號里面尋找shell變量不是一個Perl的變量。 例如,您可以在終端中運行以下行,

m=4; perl -e "print $m;"

這里

m=4; perl -e "print $m;"
^                   ^ 
|                   Accessing shell variable
Assigning shell variable

輸出為4 因為m是shell變量,所以您正在Perl腳本中訪問shell變量。

在Windows中,我們需要使用雙引號而不是單引號

似乎雙引號在您的Shell環境和Perl之間造成混亂。 您當然可以執行@mkHun建議的操作。 另一種方式:

ls | perl -e 'while(<>){chomp;($new=$_)=~s/sr/SR/g;rename $_,$new}'

另外,如果您在'$ _'中轉義了'$'標記,您的oneliner也將起作用:

ls | perl -e "while(<>){chomp;if(/sr/){rename \$_,$\`.'SR'.$'}}"

我仍然不明白為什么。但是它確實看起來像是bash / perl插值問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM