簡體   English   中英

Shell腳本按文件夾保持順序重命名文件

[英]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

您可以分兩步進行操作:

  1. 重命名所有數字都具有相同長度的文件:

     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 
  2. 現在,您可以使用已經嘗試過的方法。

在代碼中添加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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM