在tcsh
中是否有單行命令來更改一組文件的擴展名?在各種DOS彈,我曾經使用下列內容:tcsh:如何更改多個文件的文件擴展名?
ren *.abc *.def
這將重命名.abc
結尾來結束,而不是.def
所有文件。在sed
條款這將執行類似以下內容:
sed -e 's/\(.\)*\.abc$/\1.def/'
上的文件名。我可能會把它們拼湊起來,在* nix中實現類似的效果,但我猜這裏的問題是我缺少tcsh
的經驗。
任何幫助表示讚賞。
在tcsh
中是否有單行命令來更改一組文件的擴展名?在各種DOS彈,我曾經使用下列內容:tcsh:如何更改多個文件的文件擴展名?
ren *.abc *.def
這將重命名.abc
結尾來結束,而不是.def
所有文件。在sed
條款這將執行類似以下內容:
sed -e 's/\(.\)*\.abc$/\1.def/'
上的文件名。我可能會把它們拼湊起來,在* nix中實現類似的效果,但我猜這裏的問題是我缺少tcsh
的經驗。
任何幫助表示讚賞。
[整理答案 - 什麼提問者從響應了]:
有沒有簡單的方法來改變一組文件的名稱tcsh中。查斯。提供了tcsh中最簡單的解決方案,但它仍然不容易。
如果您使用tcsh作爲您的shell使用外部重命名命令(請參閱Eddie的回答),那麼執行後續操作的最佳方法是。
我明白,這不是我在問題中實際詢問的 - 但我學到的是我的問題是錯的!
感謝大家的回覆,你的回答非常有幫助 - 每個人都有不同的方式。如果有人想以比我更好的方式總結這個問題的結果,請做。我更願意把我的「接受的答案」給別人!
我不知道,如果tcsh
提供了一個更簡單的方法來做到這一點,但這裏是我最常做的:
ls *.abc | sed 's/\(.*\)\.abc/mv "\1.abc" "\1.def"/' | sh
我也寫稱爲regexmv
一個Python腳本使用正則表達式重命名文件。這裏的腳本:
import os
import re
import sys
import os.path
def main(argv):
dry_run = True
if argv[0] == '-f':
dry_run = False
argv = argv[1:]
pattern = argv[0]
repl = argv[1]
files = argv[2:]
max_length = max([len(f) for f in files])
for f in files:
new = re.sub(pattern, repl, f)
if f != new:
if not os.path.exists(new):
print "%s --> %s" % (f.ljust(max_length), new)
if not dry_run:
os.rename(f, new)
if __name__ == '__main__':
main(sys.argv[1:])
我第一次運行它,就像這樣:
regexmv '\.abc$' '.def' *
看看哪些文件會被改名(以及它們將如何被重新命名),如果這就是我想要的,我運行它:
regexmv -f '\.abc$' '.def' *
鍵入這四行。第一次提示後,tcsh會告訴你,你在foreach
循環內。你也可以把它變成一個shell腳本並調用這個shell腳本。
foreach n (`ls *.abc`)
set base = `basename $n .abc`
mv $n $base.def
end
* nix世界中沒有「擴展」的概念。 '點abc'只是文件名的一部分。有一個perl腳本來模仿here的行爲。
我很抱歉,我不能提供tcsh的,但有一個bash成語:
for f in *.foo; do
mv $f ${f%foo}bar
done
除了其他人所說,許多UNIX系統提供了一個名爲「rename
」命令。如果您的目標是使用tcsh
重命名文件,具體來說,那麼這不會對您有所幫助。否則,您可以通過以下方式實現您的目標:
rename abc def *.abc
這是一個非常簡單且非常有用的命令。在由第三個參數提供的文件列表中,它將第一個參數的所有出現替換爲第二個參數。至少在我熟悉的版本中,根本沒有模式匹配,除非你的shell會擴展第三個參數文件列表中的模式。
foreach f (*.abc)
mv $f $f:r.xyz
end