[英]shell script to rename files in folder keeping order
在一個文件夾中,我有幾個文件,例如
name_1.txt
name_2.txt
name_12.txt
name_13.txt
我想將它們重命名為
name_1.txt -> name_1.txt
name_2.txt -> name_2.txt
name_12.txt -> name_3.txt
name_13.txt -> name_4.txt
以下代碼部分完成了工作,但沒有保持順序
#!/bin/sh
num=1
for file in *.txt; do
mv "$file" "$(printf "%u" $num).txt"
let num=$num+1
done
確實輸出是
name_1.txt -> 1.txt
name_2.txt -> 4.txt
name_12.txt -> 2.txt
name_13.txt -> 3.txt
如何確定名稱和順序? 謝謝!
*.txt
擴展為name_12.txt name_13.txt name_1.txt name_2.txt
因為這對計算機最有意義。 您將需要對此進行分類,以我們的人工方式開始。 ls
命令可以使用自然排序ls -v *.txt
很好地做到這一點。
這意味着代碼將需要看起來像這樣...
#!/bin/sh
num=1
for file in $(ls -v *.txt); do
mv "$file" "$(printf "%u" $num).txt"
let num=$num+1
done
您可以分兩步進行操作:
重命名所有數字都具有相同長度的文件:
for file in name_?.txt ; do if [[ -f ${file/_/_0} ]] ; then echo "Can't rename $file: ${file/_/_0} already exists." >&2 exit 1 fi mv "$file" "${file/_/_0}" done
這會將name_1.txt
重命名為name_01.txt
等。
您也可以使用rename
,但是有許多具有不同語法的版本,例如
rename _ _0 rename_?.txt # or rename 's/_/_0/' rename_?.txt
現在,您可以使用已經嘗試過的方法。
在代碼中添加sort -n
#!/bin/sh
num=1
for file in $(ls *.txt | sort -n) do
mv "$file" "$(printf "%u" $num).txt"
let num=$num+1
done
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.