Shell

查找名稱相似的文件,刪除最舊的,重命名最近的

  • December 18, 2017

我有這種情況,在不同的子文件夾中有很多名稱相似的文件(但它們都遵循一種模式)

file1
file1 (Copy)
/folder1/file2.txt
/folder1/file2 (Copy).txt
/folder1/file3.png
/folder1/file3 (Copy).png

每個文件都在其副本的同一個文件夾中,並且具有相同的副檔名,不同之處在於它(Copy)在名稱的末尾

我想獲取所有這些文件並刪除最舊的文件,然後最終將文件重命名為,例如,如果需要重命名(即刪除後綴file1 (Copy)file1(Copy)

我正在考慮使用findmv但我不知道如何告訴它移動最新的。

擴展**find+bash**解決方案(也需要 GNU 實現stat):

find . -type f -name "* (Copy).*" -exec bash -c 'p="${0%/*}"; bn="${0##*/}"; 
       main_bn="${bn/ (Copy)/}"; 
       if [ -f "$p/$main_bn" ]; then 
          t_copy_file=$(stat -c %Y "$0"); t_main_file=$(stat -c %Y "$p/$main_bn"); 
          if [[ $t_copy_file -gt $t_main_file ]]; then 
              mv "$0" "$p/$main_bn"; 
          else
              rm "$0"; 
          fi; 
       fi' {} \;

  • p="${0%/*}"- 修剪基本名稱的文件路徑/路徑

  • bn="${0##*/}"- 文件的基本名稱

  • main_bn="${bn/ (Copy)/}"- 從基本名稱中刪除(Copy)子字元串以獲得主要/公共基本名稱

  • if [ -f "$p/$main_bn" ]- 如果主/原始文件存在(並且在符號連結解析後發現是正常文件)

    • t_copy_file=$(stat -c %Y "$0")*- 獲取找到的“複製”*文件的最後修改時間
    • t_main_file=$(stat -c %Y "$p/$main_bn")- 獲取原始文件的最後修改時間
    • if [[ $t_copy_file -gt $t_main_file ]]- 如果*“複製”文件是最近的 - 將其移動到原始文件(使其成為原始*文件)mv "$0" "$p/$main_bn"
    • 否則 -原始文件是最近的文件,刪除“複製”文件rm "$0"

或者使用-nt文件測試運算符稍短一些([ new­er­file –nt olderfile ]- 檢查是否newerfile最近更改了olderfile,或者是否newerfile存在並且olderfile不存在):

find . -type f -name "* (Copy).*" -exec bash -c 'p="${0%/*}"; bn="${0##*/}"; 
       main_bn="${bn/ (Copy)/}"; 
       if [ -f "$p/$main_bn" ]; then 
          if [ "$0" -nt "$p/$main_bn" ]; then 
              mv "$0" "$p/$main_bn"; 
          else
              rm "$0"; 
          fi; 
       fi' {} \;

引用自:https://unix.stackexchange.com/questions/406247