[英]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.