[英]Shell/Bash shortcut for bulk renaming of files in a folder
Shell/Bash 中是否有快捷方式可以根據正則表達式或其他一些條件重命名文件夾中的所有文件。 我在這里尋找的是在我的文件夾文檔中,假設有 100 個具有以下命名約定的文本文件:
<longdocumentidentifier>-doc-<counter>.txt.
我需要使用上述給定的約定將所有文件重命名為:
doc-<counter>.txt
有沒有可以幫助我解決上述問題的單線?
我會建議這樣的事情:
for i in *-doc-*.txt; do mv "$i" "${i/*-doc-/doc-}"; done
${i/*-doc-/doc-}
替換第一個出現*-doc-
與doc-
。
如果您需要進行多次替換(請參閱注釋編號 1),則需要使用${var//Pattern/Replacement}
變體。 如果您需要替換名稱的開頭,您需要使用${var/#Pattern/Replacement}
,如果您需要替換結尾(即:擴展名),您需要使用${var/%Pattern/Replacement}
表格。
有關更多詳細信息,請參閱外殼參數擴展。 此擴展是特定於 bash 的。
如果您rename
則rename 's/^.*-doc-/doc-/' *.txt
應該可以解決問題。
有prename
,它允許您使用正則表達式:
prename 's/^.*-doc-(.*\.txt)$/doc-$1/' *.txt
使用選項-n
來模擬:
prename -n 's/^.*-doc-(.*\.txt)$/doc-$1/' *.txt
注意:這是在許多 Linux 發行版中作為rename
提供的,但並非在所有發行版中都如此——所以我使用 Perl 附帶的實用程序的規范名稱。
如果你想遞歸到子目錄,還有:
find . -maxdepth N -type f -name "$pattern" | sed -e 'p' -E -e "s/$str1/$str2/g" | xargs -n2 mv
在自動支持擴展正則表達式的系統上,您可以省略-E
。
好處:
缺點:
(答案從這里修改)
例如,大多數 linux 內置的 rename 命令將很容易做到這一點。
就我個人而言,我也更喜歡正則表達式,這就是為什么我一直在使用這個腳本很長一段時間(閱讀:自 80 年代末或 90 年代初以來):
#!/usr/bin/perl
($op = shift) || die "Usage: $0 expr [files]]\n";
if(!@ARGV)
{
@ARGV = <STDIN>;
chop(@ARGV);
}
for (@ARGV)
{
$was = $_;
eval $op;
die $@ if $@;
if ($was ne $_)
{
print "rename($was,$_)\n";
rename($was,$_);
}
}
安裝后,您可以執行以下操作:
script-name 's/.*-doc(.*).txt/doc$1.txt/' *.txt
mmv "*-doc-*" "doc-#2"
mmv 命令代表“大規模移動”
找 。 -name '*scss' | xargs -L1 -I {} echo {} {} | sed 's/css.scss$/scss/' | xargs -L1 mv
例如,如果您有一堆以“.css.scss”結尾的文件,並且您想將它們重命名為僅以“.scss”結尾(即刪除 .css 部分)
調整正則表達式並找到滿足您需求的參數
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.