我有一個名稱包含空格的檔案夾和檔案的串列。如何將名稱更改為駝峰式?
for oldname in *
do
newname=`echo $oldname | sed -e 's/ /_/g'`
if [ "$newname" = "$oldname" ]
then
continue
fi
if [ -e "$newname" ]
then
echo Skipping "$oldname", because "$newname" exists
else
mv "$oldname" "$newname"
fi
done
我發現了這一點,但它將空格更改為下劃線。
uj5u.com熱心網友回復:
試試這個Shellcheck -clean Bash 代碼:
#! /bin/bash -p
lowers=abcdefghijklmnopqrstuvwxyz
uppers=ABCDEFGHIJKLMNOPQRSTUVWXYZ
for oldname in *; do
[[ $oldname == *[[:space:]]* ]] || continue
read -r -d '' -a parts <<<"$oldname"
newname=''
for p in "${parts[@]}"; do
char1=${p:0:1}
if [[ $lowers == *"$char1"* ]]; then
tmp=${lowers%"$char1"*}
uchar1=${uppers:${#tmp}:1}
newname =${uchar1}${p:1}
else
newname =$p
fi
done
if [[ -e $newname ]]; then
printf "Skipping '%s', because '%s' exists\\n" "$oldname" "$newname" >&2
else
echo mv -v -- "$oldname" "$newname"
fi
done
- 該代碼旨在與(現在古老的)Bash 3 一起使用,因為我的理解是它仍然是 macOS 上標準 Bash 的當前版本。將檔案名部分的首字母大寫的代碼比使用 Bash 的更高版本(具有內置的大小寫轉換機制)復雜得多。請參閱如何在 Bash 中將字串轉換為小寫?有關在各種版本的 Bash 中以各種方式更改大小寫的資訊。
- 該代碼僅列印
mv將要運行的命令。洗掉echo以使其實際執行mv. - 請參閱為什么 printf 比 echo 更好?解釋為什么我用
echo“printf跳過”訊息替換。
為了比較,這是 Bash 4 代碼:
#! /bin/bash -p
for oldname in *; do
[[ $oldname == *[[:space:]]* ]] || continue
read -r -d '' -a parts <<<"$oldname"
newname=''
for p in "${parts[@]}"; do
newname =${p^}
done
if [[ -e $newname ]]; then
printf "Skipping '%s', because '%s' exists\\n" "$oldname" "$newname" >&2
else
echo mv -v -- "$oldname" "$newname"
fi
done
uj5u.com熱心網友回復:
如果您安裝了重命名,那么您需要做的就是:
rename 's/ /_/g' *
uj5u.com熱心網友回復:
您可以使用正則運算式 aptitude 來處理大寫和小寫翻譯,關于您當前的本地排序規則(LC_ALL,使用locale命令檢查)。
如果你的檔案名的“單詞”用空格分隔并且都是小寫的,你可以使用一個簡單的 shell 腳本,如下所示:
#!/bin/sh
while read -r FILENAME ; do
NEWNAME="`echo \"${FILENAME}\" | sed 's/ *\([^ ]\)/\u\1/g'`"
if [ ! "${NEWNAME}" ] ; then
NEWNAME="${FILENAME}";
fi
if [ "${FILENAME}" = "${NEWNAME}" ]; then
printf "No change : %s\\n" "${FILENAME}" >&2;
else
if [ -e "${NEWNAME}" ] ; then
printf "Already changed : %s => %s\\n" "${FILENAME}" "${NEWNAME}" >&2;
else
echo "mv \"${FILENAME}\" \"${NEWNAME}\"";
fi
fi
done
去掉echoonecho "mv \"${FILENAME}\" \"${NEWNAME}\"";來做mv。
請注意,它應該適用于重音字母或任何具有低位和高位代碼的 unicode 字母。
該腳本使用檔案串列進行操作stdin,因此要“按原樣”使用它,您可以使用以下示例:
find . -type 'f' | theScript.sh對于整個檔案樹。對于檔案夾,您必須單獨操作它們。列出它們并按降序對它們進行排序。
ls -1 | theScript.sh對于當前檔案夾中的檔案。
如果您的檔案在開始時可能全部或部分大寫,并且您希望將它們完全強制為駝峰式,您可以更改該行:
NEWNAME="`echo \"${FILENAME}\" | sed 's/ *\([^ ]\)/\u\1/g'`"
和:
NEWNAME="\`echo \"${FILENAME}\" | sed 's/\(.*\)/\l\1/;s/ *\([^ ]\)/\u\1/g'\`"
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/474089.html
下一篇:在MacOS上截屏
