我正在嘗試將 3,000 個左右的 .svg 檔案從 CapitalCase 轉換為 camelCase。
當前的:
-Folder
--FileName1
--FileName2
--FileName3
目標:
-Folder
--fileName1
--fileName2
--fileName3
如何使用終端將第一個字符的大小寫更改為小寫?
目前我一直在嘗試這些方面的東西:for f in *.svg; do mv -v "$f" "${f:1}"; done
檔案夾中的所有檔案都以字母或數字開頭。
uj5u.com熱心網友回復:
這可以通過以下方式非常簡潔地zsh
完成zmv
:
autoload zmv
zmv -nvQ '(**/)(?)(*.svg)(.)' '$1${(L)2}$3'
這將通過任意數量的目錄級別進行遞回,并且可以處理名稱沖突和其他邊緣情況。部分作品:
-n
: 不執行。使用此選項,zmv
將僅報告它將進行的更改。這是一個可用于測驗模式的試運行。當您準備好實際更改名稱時將其洗掉。-v
: 冗長。-Q
: 限定詞。用于指示源模式包含一個 glob 限定符(在我們的例子中(.)
)。'(**/)(?)(*.svg)(.)'
: 源模式。這只是一個常規的zsh
glob 模式,用括號分成幾組。基本模式是**/?*.svg(.)
。碎片:(**/)
: 目錄和子目錄。這將匹配任意數量的目錄級別(僅影響當前目錄,見下文)。(?)
: 匹配檔案名開頭的單個字符。稍后我們會將其轉換為小寫。(*.svg)
: 匹配檔案名的其余部分。(.)
: 僅常規檔案。這是一個zsh
全域限定符;由于該選項zmv
,將其識別為限定符而不是分組。-Q
限定符將.
匹配限制為常規檔案,這樣我們就不會嘗試重命名目錄。
'$1${(L)2}$3'
: 目的地模式。源模式中的每個分組都以 $1、$2 等順序參考。$1
: 目錄。這可能包含多個級別。${(L)2}
: 檔案名中的第一個字母,轉換為小寫。這使用L
引數擴展標志來改變大小寫。擴展修飾符也將起作用
:. 轉換可以處理非 ASCII 字符,例如會變成.l
$2:l
éxito
éxito
$3
: 檔案名的其余部分,包括擴展名。
變化
這只會更改當前目錄中的檔案:
zmv -nv '(?)(*.svg)' '$1:l$2'
以下版本中的源模式將僅匹配以大寫字母開頭的檔案。由于zmv
如果源和目標匹配,該實用程式不會重命名檔案,這不是絕對必要的,但它會稍微更有效:
zmv -nvQ '(**/)([[:upper:]])(*.svg)(.)' '$1${(L)2}$3'
更多資訊
zmv
檔案:
https ://zsh.sourceforge.io/Doc/Release/User-Contributions.html#index-zmvzsh
引數擴展標志:
https ://zsh.sourceforge.io/Doc/Release/Expansion.html#Parameter-Expansion-Flags- 帶有一些
zsh
注釋的頁面,包括一堆zmv
示例:
https ://grml.org/zsh/zsh-lovers.html
uj5u.com熱心網友回復:
如果您只需要重命名檔案夾的檔案,而不需要重命名其子檔案夾的檔案,那么下面的 AsObjC 腳本將執行此操作。
這段代碼的優點是你不必擔心本地化和特殊字母,這些在 shell 命令中是有問題的。
use AppleScript version "2.4"
use framework "Foundation"
use scripting additions
set theFolder to (choose folder) as text -- hfs path here
tell application "System Events"
repeat with aFile in (get files of folder theFolder)
set aName to name of aFile
set firstCharcterNSString to (current application's NSString's stringWithString:(aName's character 1))
set firstCharcter to firstCharcterNSString's lowercaseString() as text
try
set name of aFile to firstCharcter & (text 2 thru -1 of aName)
on error
set name of aFile to firstCharcter
end try
end repeat
end tell
uj5u.com熱心網友回復:
用 bash 解決,經過測驗并且作業正常,但要小心處理您的檔案。
重命名此腳本所在的當前目錄中的檔案(第一個 arg then'd be .
)或提供路徑,如果它是大寫字母,它將對第一個字母進行小寫,但如果它是數字,則必須提供引數:
# 1 argument - folder name
# 2 argument - file extension (.txt, .svg, etc.)
for filename in $(ls "$1" | grep "$2")
do
firstChar=${filename:0:1}
restChars=${filename:1}
if [[ "$firstChar" =~ [A-Z] ]] && ! [[ "$firstChar" =~ [a-z] ]]; then
toLowerFirstChar=$(echo $firstChar | awk '{print tolower($0)}')
modifiedFilename="$toLowerFirstChar$restChars"
mv "$1/$filename" "$1/$modifiedFilename"
else
echo "Non-alphabetic or already lowercase"
# here may do what you want fith files started with numbers in name
fi
done
利用:bash script.sh Folder .txt
注意:現在在運行腳本和重命名之后,某些檔案的名稱可能會重合,在這種情況下會發生沖突。以后可以修復它并更新此腳本。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/496700.html
上一篇:cp:將phpMyAdmin檔案夾復制到/Library/WebServer/Documents/時沒有這樣的檔案或目錄