Linux
檢查相關文件名並刪除其中一個
我需要編寫一個腳本來查找名稱中包含字元串的文件。如果存在同名但沒有該字元串的文件,我想刪除原始文件。
例如,如果我在包含以下文件的目錄中:
algomb gomba alb algomba alba
如果子字元串是,
gom
那麼我會考慮algomb
,gomba
和algomba
. 從每個名稱中刪除gom
,我會檢查alb
,ba
和alba
. 其中,alb
確實alba
存在,所以我會刪除algomb
並algomba
離開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