我有這些測驗檔案:
ABCD1234__12_Ab2_Hh_3P.mp4
ABCD1234__12_Ab2_Lw_3P.wmv
ABCD1234__12_Ab2_SSV.mov
EFGH56789__13_Mn1_SSV.avi
EFGH56789__13_Mn1_Ve1_3P.mp4
EFGH56789__13_Mn1_Ve2_3P.webm
我想在 Automator 中創建一個背景關系服務,它根據上面的檔案名前綴創建目錄,如下所示:
ABCD1234__12_Ab2
EFGH56789__13_Mn1
...并相應地將檔案移動到這兩個檔案中。名稱中唯一一致的變數是下劃線,所以我想我可以用這些來描述,最好在第四個之前捕獲名稱。
我最初從這個非常簡單的腳本開始:
for file in "$@"
do
mkdir "${file%.*}" && mv "$file" "${file%.*}"
done
這為每個檔案創建一個檔案夾并將每個檔案移動到自己的檔案夾中。
我嘗試添加變數、各種 if/thens 等,但無濟于事(不是程式員)。
我還撰寫了另一個腳本,以稍微不同的方式完成它,但結果相同:
for folder in "$@"
do
cd "$1"
find . -type f -maxdepth 1 -exec bash -c 'mkdir -p "${0%.*}"' {} \; \
-exec bash -c 'mv "$0" "${0%.*}"' {} \;
done
我覺得我缺少一些明顯的東西。
uj5u.com熱心網友回復:
您的腳本在點上拆分,但您說要在下劃線上拆分。如果您要拆分的那個是最后一個,則解決方法很簡單:
for file in "$@"
do
mkdir -p "${file%_*}" && mv "$file" "${file%_*}"
done
要精確地獲得第四個,請嘗試
for file in "$@"
do
tail=${file#*_*_*_*_}
dir=${file%_"$tail"}
mkdir -p "$dir" && mv "$file" "$dir"
done
-p如果您想在&&這里使用,添加該選項是必要的錯誤修復;mkdir如果目錄已經存在,則沒有此選項將失敗。
也許還可以參見Bash 參考手冊中關于引數擴展的部分,它解釋了這種語法及其變體。
uj5u.com熱心網友回復:
你可以這樣做:
#!/bin/bash
shopt -s extglob
for file
do
if [[ $file =~ ^(([^_]*_){3}[^_]*) ]]
then
echo "${BASH_REMATCH[0]}"
else
echo "${file%.*}"
fi
done
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/392373.html
