Shell
查找名稱相似的文件,刪除最舊的,重命名最近的
我有這種情況,在不同的子文件夾中有很多名稱相似的文件(但它們都遵循一種模式)
file1 file1 (Copy) /folder1/file2.txt /folder1/file2 (Copy).txt /folder1/file3.png /folder1/file3 (Copy).png
每個文件都在其副本的同一個文件夾中,並且具有相同的副檔名,不同之處在於它
(Copy)
在名稱的末尾我想獲取所有這些文件並刪除最舊的文件,然後最終將文件重命名為,例如,如果需要重命名(即刪除後綴
file1 (Copy)
)file1
。(Copy)
我正在考慮使用
find
,mv
但我不知道如何告訴它移動最新的。
擴展**
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
文件測試運算符稍短一些([ newerfile –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' {} \;