Linux

檢查相關文件名並刪除其中一個

  • October 5, 2016

我需要編寫一個腳本來查找名稱中包含字元串的文件。如果存在同名但沒有該字元串的文件,我想刪除原始文件。

例如,如果我在包含以下文件的目錄中:

algomb
gomba
alb
algomba
alba

如果子字元串是,gom那麼我會考慮algomb,gombaalgomba. 從每個名稱中刪除gom,我會檢查alb,baalba. 其中,alb確實alba存在,所以我會刪除algombalgomba離開

alb
alba
gomba

完成後在目錄中。

這是我嘗試過的:

#!/bin/bash
sz="gom"

talal=`find . -type f -name "*$sz*" -exec basename {} \;`
ossz=`find . -type f -exec basename {} \;`
c=`echo ${talal%%:*}${talal##*:}`

for c in ossz; do       
   if [ ! -d ]; then
       echo "This is a directory"  
   else    
       if [ -f ];
       then
           find .-type f -name "*$sz*" -exec basename {} \;  
       else
           echo ${talal%%:*}${talal##*:} 
       fi  
   fi
done

所以這是有效的。這echo ${talal%%:*}${talal##*:}是返回沒有“gom”的文件名。但我無法將這些值與 find . -type f -exec basename {} \;結果進行比較。

鑑於我可以找到子字元串,我如何測試文件並刪除適當的文件?

以下應該滿足您的要求:

#!/bin/bash
sz="gom"
dir="/where/the/files/are"

find $dir -type f -name "*${sz}*" -print0 | while read -d '' -r c; do
   if [[ -f "$(echo $c | sed 's/'"${sz}"'//g')" ]]; then
       # Strip the 'echo' to have this actually do things
       echo rm -v "$c"
   fi
done

關於更改和修復的一些說明:

  • Find-printf "%f\n"優於-exec basename {} \;. 在這種情況下,我刪除了 find 剝離目錄名,以便腳本對於非平面目錄結構是安全的。
  • for c in ossz不應該工作 - 裸名ossz不是變數。$ossz本來是需要的。
  • 出於可讀性原因,使用sed可能比依賴 bash 模式匹配和替換更可取。

例子:

對於包含以下文件的目錄:

alb  alba  algomb  algomba  gomb

上面的腳本將輸出以下內容:

rm -v ./algomb
rm -v ./algomba

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