我是一名攝影師,我在一個檔案夾中有多個 jpg 服裝檔案。檔案名結構為:
TYPE_FABRIC_COLOR(例如:BU23W02CA_CNU_RED、BU23W02CA_CNU_BLUE、BU23W23MG_LINO_WHITE)
我必須在一個名為 TYPE 的檔案夾中移動相同型別 (BU23W02CA) 的檔案。
例如:
主檔案夾>
BU23W02CA_CNU_RED.jpg、BU23W02CA_CNU_BLUE.jpg、BU23W23MG_LINO_WHITE.jpg
成為:
主檔案夾>
BU23W02CA_CNU > BU23W02CA_CNU_RED.jpg, BU23W02CA_CNU_BLUE.jpg
BU23W23MG_LINO > BU23W23MG_LINO_WHITE.jpg
uj5u.com熱心網友回復:
這里有一些腳本。
V1
#!/bin/bash
find . -maxdepth 1 -type f -name "*.jpg" -print0 | while IFS= read -r -d '' file
do
# Extract the directory name
dirname=$(echo "$file" | cut -d'_' -f1-2 | sed 's#\./\(.*\)#\1#')
#DEBUG echo "$file --> $dirname"
# Create it if not already existing
if [[ ! -d "$dirname" ]]
then
mkdir "$dirname"
fi
# Move the file into it
mv "$file" "$dirname"
done
- 它假定所有檔案的
find串列都是您在問題中描述的格式,即TYPE_FABRIC_COLOR.ext. dirname_是提取檔案名中由分隔的前兩個單詞。- 由于
find列出了帶有./前綴的檔案,因此它也會從 中洗掉dirname(這就是sed命令的作用)。 find指定要考慮為的檔案的名稱*.jpg。如果您想限制在移動中考慮哪些檔案,您可以將其更改為其他內容。- 這個版本回圈遍歷每個檔案,創建一個包含前兩個部分的目錄(如果它不存在),然后將檔案移動到其中。
- 如果您想查看腳本對每個檔案執行的操作,可以
-v在mv命令中添加選項。我用它來除錯。
但是,由于它逐個回圈遍歷每個檔案,因此處理大量檔案可能需要一些時間,因此下一個版本。
V2
#!/bin/bash
while IFS= read -r dirname
do
echo ">$dirname"
# Create it if not already existing
if [[ ! -d "$dirname" ]]
then
mkdir "$dirname"
fi
# Move the file into it
find . -maxdepth 1 -type f -name "${dirname}_*" -exec mv {} "$dirname" \;
done < <(find . -maxdepth 1 -type f -name "*.jpg" -print | sed 's#^\./\(.*\)_\(.*\)_.*\..*$#\1_\2#' | sort | uniq)
- 此版本在目錄名稱上回圈,而不是在每個檔案上回圈。
- 最后一行執行“魔術”。它
find是所有檔案,并立即提取前兩個單詞(withsed)。然后這些詞是sorted和“uniqued”。 - 然后
while回圈一個一個地創建每個目錄。 - 回圈
find內部將while與正在處理的目錄匹配的所有檔案移動到其中。為什么我不干脆mv ${dirname}_* ${dirname}呢?由于*通配符的擴展可能導致命令的引數串列過長mv。這樣做可以find確保它甚至可以處理大量檔案。
uj5u.com熱心網友回復:
建議onelinerawk腳本:
echo "$(ls -1 *.jpg)"| awk '{system("mkdir -p "$1 OFS $2);system("mv "$0" "$1 OFS $2)}' FS=_ OFS=_
解釋:
echo "$(ls -1 *.jpg)": 列出當前目錄下的所有 jpg 檔案,每行一個檔案
FS=_ : 設定awk欄位分隔符為_$1=type $2=fabric $3=color.jpg
OFS=_ :將awk輸出欄位分隔符設定為_
awk 腳本解釋
{ # for each file name from list
system ("mkdir -p "$1 OFS $2); # execute "mkdir -p type_fabric"
system ("mv " $0 " " $1 OFS $2); # execute "mv current-file to type_fabric"
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/436713.html
