我有這種格式的檔案:
2022-03-5344-REQUEST.jpg
2022-03-5344-IMAGE.jpg
2022-03-5344-00imgtest.jpg
2022-03-5344-anotherone.JPG
2022-03-5343-kdijffj.JPG
2022-03-5343-zslkjfs.jpg
2022-03-5343-myimage-2010.jpg
2022-03-5343-anotherone.png
2022-03-5342-ebee5654.jpeg
2022-03-5342-dec.jpg
2022-03-5341-att.jpg
2022-03-5341-timephoto_december.jpeg
....
大約 13k 幅這樣的影像。
我想創建如下檔案夾:
2022-03-5344/
2022-03-5343/
2022-03-5342/
2022-03-5341/
....
我開始像這樣手動移動它們:
mkdir name
mv name-* name/
但是我當然不會對 13k 檔案重復這個程序。
因此,我想使用 bash 腳本來執行此操作,并且由于我是 bash 新手,并且我在生產環境中作業,所以我想安全地玩它,但它并沒有給我我的結果。這是我到目前為止所做的:
#!/bin/bash
name = $1
mkdir "$name"
mv "${name}-*" $name/
我所能做的就是:./move.sh name對于每個檔案夾,我不知道如何使用回圈來自動化它。
uj5u.com熱心網友回復:
和bash一個正則運算式。我假設檔案都在當前目錄中。
for name in *; do
if [[ "$name" =~ (^....-..-....)- ]]; then
dir="${BASH_REMATCH[1]}"; # dir contains 2022-03-5344, e.g.
echo mkdir -p "$dir" || exit 1;
echo mv -v "$name" "$dir";
fi;
done
如果輸出看起來沒問題,請洗掉兩個echo.
uj5u.com熱心網友回復:
嘗試這個
xargs -i sh -c 'mkdir -p {}; mv {}-* {}' < <(ls *-*-*-*|awk -F- -vOFS=- '{print $1,$2,$3}'|uniq)
或者:
find . -maxdepth 1 -type f -name "*-*-*-*" | \
awk -F- -vOFS=- '{print $1,$2,$3}' | \
sort -u | \
xargs -i sh -c 'mkdir -p {}; mv {}-* {}'
或使用正則運算式查找:
find . -maxdepth 1 -type f -regextype posix-extended -regex ".*/[0-9]{4}-[0-9]{2}-[0-9]{4}.*"
uj5u.com熱心網友回復:
你可以使用awk
$ cat awk.script
/^[[:digit:]-]/ && ! a[$1] {
dir=$1
} /^[[:digit:]-]/ {
system("sudo mkdir " dir )
system("sudo mv " $0" "dir"/"$0)
}
呼叫腳本并用于您的目的;
$ awk -F"-([0-9] )?[[:alpha:]] .*" -f awk.script <(ls)
您會看到一些錯誤,例如;
mkdir: cannot create directory ‘2022-03-5341’: File exists
創建初始目錄后,您可以放心地忽略這些,因為該目錄現在存在。
現在每個目錄的內容都會有相關的檔案
$ ls 2022-03-5344
2022-03-5344-00imgtest.jpg 2022-03-5344-IMAGE.jpg 2022-03-5344-REQUEST.jpg 2022-03-5344-anotherone.JPG
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/483474.html
上一篇:如何撰寫一個訪問docker內部資料庫然后插入資料的bash腳本?
下一篇:如何在bash中傳輸變數
