首頁>Program>source

我在目錄中有檔案列表,其中檔案名采用hh-mm-ss時間格式。

05-31-04.mp4 
05-32-04.mp4 
05-34-04.mp4 
05-33-04.mp4
05-30-00.mp4

我需要根据檔案名對檔案进行排序

類似

05-30-00.mp4
05-31-04.mp4 
05-32-04.mp4 
05-33-04.mp4
05-34-04.mp4

現在我有下面的代碼列出了檔案

x=$(find . -name "*.mp4" -printf "%f\n")
for file in $x; do
  echo "File -> $file"
最新回復
  • 5月前
    1 #

    那根本不是陣列. x 是一个簡單的字元串變數,在不加引號的情况下迴圈訪問它会在空白處进行分割。

    如果您的檔案名中包含空格或其他shell元字元,那麼這是有問题的,但是如果您的簡單檔案名具有代表性,那麼這是不現實的.在這種情况下,... sort

    x=$(find . -name "*.mp4" -printf "%f\n" | sort)
    printf "File -> %s\n" $x
    

    但是,不引用字元串變數会帶来大量警告.可能實際上確實使用了陣列。

    readarray -d '' x < <(find . -name "*.mp4" -print0 | sort -z)
    printf "File -> %s\n" "${x[@]}"
    

    readarray 需要Bash 4+,所以在MacOS上無法使用. find -print0 和它的同伴 sort -z 是GNU擴充套件,不能移植到POSIX /非GNU系統。)

    如果所有檔案都在当前目錄中,則為 find 是完全過分的; 只需使用外壳程式的內建萬用字元擴充套件即可,預設情况下会进行排序。

    printf "File -> %s\n" *.mp4
    

    如果您需要遍歷檔案並執行比仅print每个檔案更有用的操作,則不需要變數.只需直接在萬用字元擴充套件上迴圈即可。

    for file in *.mp4; do
        # This is where we do something more useful than ...
        printf "File -> %s\n" "$file"
    done
    

    註意如何引用 "$file" 在迴圈內部.当您使用琐碎的檔案名對其进行測試時,它看起来似乎没有引用就可以工作,但是当您在實際檔案上執行它時,它会以壮观且难以除錯的方式中斷。

  • java:Selenium中的ElementNotInteractable異常
  • detectron:找不到Detectron2檢查點