我是一個編程的新學生,我被一個問題卡住了,這個問題是: 輸入一條命令,洗掉所有檔案名以logtest開頭的檔案,除了logtest本身(洗掉所有以'logtest'開頭的檔案,后面跟著一個或多個字符。)
rm -r -- !(logtest.*)沒有起作用。
uj5u.com熱心網友回復:
輸入一個命令,洗掉所有檔案名以logtest開頭的檔案,除了logtest本身(洗掉所有以'logtest'開頭的檔案,后面有一個或多個字符。)
rm logtest?
? 匹配單個字符。* 匹配0個或更多。將它們結合起來以匹配1個或更多的字符。
或者,如果你是指所有這樣的檔案,而不僅僅是某個特定目錄下的檔案......
find / -name "logtest?*" -exec rm {}.
uj5u.com熱心網友回復:
你的方法并非完全錯誤。因為你處理的是一個來到STDIN的串列,而rm期待引數,你需要使用xargs。
另一件事是,當你grep一個檔案名時,你必須轉義一個點。你的命令應該是這樣的:
你的命令應該是這樣的。
ls | grep -v 'logtest.' | grep 'logtest' | xargs rm
注意,你做了一個雙倍的grep。第一個是排除你的logtest.*本身,第二個是包括你的其余檔案與logtest。
uj5u.com熱心網友回復:
類似這樣的東西應該可以作業:
for file in *; do
# 確保該檔案是一個檔案而不是一個目錄。
[ -f "$file" ] & & {
if printf "%s"/span> "$file" | grep "^logtest. " > /dev/null; then
rm -f "$file"。
fi。
}
done
這不會決議ls的輸出,確保該檔案實際上是一個檔案,并且對空格也有效(名稱如 "logtest")。
'^'意味著匹配字串的開頭,這樣像 "test_logtest "這樣的東西就不會被匹配,而結尾的'.'則確保匹配后有字符存在。> /dev/null代表將grep命令的輸出重定向到/dev/null(所有發送到那里的內容都會被丟棄),這基本上隱藏了grep匹配的內容,使其不會顯示在輸出中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/324022.html
標籤:
