簡體   English   中英

在 Bash 中遞歸更改文件擴展名

[英]Recursively change file extensions in Bash

我想遞歸遍歷一個目錄並更改某個擴展名的所有文件的擴展名,比如.t1.t2 執行此操作的 bash 命令是什么?

用:

find . -name "*.t1" -exec bash -c 'mv "$1" "${1%.t1}".t2' - '{}' +

如果您有可用的rename請使用以下之一

find . -name '*.t1' -exec rename .t1 .t2 {} +
find . -name "*.t1" -exec rename 's/\.t1$/.t2/' '{}' +

如果您的bash版本支持globstar選項(版本 4 或更高版本):

shopt -s globstar
for f in **/*.t1; do
    mv "$f" "${f%.t1}.t2"
done 

我會在 bash 中這樣做:

for i in $(ls *.t1); 
do
    mv "$i" "${i%.t1}.t2" 
done

編輯:我的錯誤:它不是遞歸的,這是我遞歸更改文件名的方法:

for i in $(find `pwd` -name "*.t1"); 
do 
    mv "$i" "${i%.t1}.t2"
done

或者您可以簡單地安裝mmv命令並執行以下操作:

mmv '*.t1' '#1.t2'

這里#1是第一水珠部分即**.t1

或者在純 bash 的東西中,一個簡單的方法是:

for f in *.t1; do
    mv "$f" "${f%.t1}.t2"
done

(即: for可以在沒有外部命令(如lsfind )幫助的情況下列出文件)

HTH

在全新安裝的 debian 14 上,上述解決方案均不適合我。這應該適用於任何 Posix/MacOS

find ./ -depth -name "*.t1" -exec sh -c 'mv "$1" "${1%.t1}.t2"' _ {} \;

所有學分: https : //askubuntu.com/questions/35922/how-do-i-change-extension-of-multiple-files-recursively-from-the-command-line

我對這些解決方案之一的懶惰復制粘貼不起作用,但我已經安裝了fd-find ,所以我使用了它:

fd --extension t1 --exec mv {} {.}.t2

fd的聯機幫助頁,執行命令時(使用--exec ):

          The following placeholders are substituted by a
          path derived from the current search result:

          {}     path
          {/}    basename
          {//}   parent directory
          {.}    path without file extension
          {/.}   basename without file extension

暫無
暫無

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

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