2017-03-17 82 views
1

我想從子文件夾中刪除所有emacs備份(〜)文件。 我知道我可以在每個文件夾中使用cd,並使用rm *~(例如備份文件test.cpp〜)將它們刪除。如何從終端遞歸刪除某些名稱的文件

如何用一個命令刪除這些文件,而無需在每個文件夾中進行cd'ing操作?

(我試過rm -r *~rm -rf *~,但他們似乎並不管用)

+0

爲了記錄,使用'rm -f *〜'而不是'rm *〜'是個好主意,因爲如果沒有備份文件,'rm'會抱怨它找不到'*〜' 。使用'-f'會使它不會抱怨你並退出時出錯。 –

回答

2

你可以用findexec來做到這一點。下面是一個你想要做的例子:

find -name '*~' -exec rm {} \; 

讓我們來分解它是如何工作的。 find命令將執行從其執行的目錄,默認情況下它將打印出它找到的所有內容。使用-name '*~'告訴我們只選擇名稱與正則表達式*~匹配的條目。我們必須引用它,否則shell可能會爲我們擴展它。使用-exec rm {}將執行rm找到的每件事情,並將{}作爲文件名的佔位符。 (最後的;需要告訴find這是命令結束的地方,這不是什麼大不了的事情,但如果你不使用它,它會發出嗚嗚聲,什麼也不做,\就是爲了逃避它,因爲;是一個特殊的shell字符)

+0

爲什麼'-exec rm {} \;'而不是'-delete'? –

+2

簡短回答:這不會刪除目錄,也不需要'-type f'。較長的答案是使用'-delete'不能與'-prune'一起使用,因爲'-prune'意味着'-depth'。在這種情況下並不重要,但是使用'rm {}'可以使它在以後更具可擴展性。此外,如果您稍後選擇使用GNU Parallel,它也可以更好地工作。 –

+0

@RandyMorris也afaik -delete是一個GNU(和BSD)擴展,它不在POSIX中,但我可能是錯誤的。 –

0

你會發現使用:

find ./ -name *~ -exec rm {} \; 

此命令將遞歸列出所有文件,匹配給定的圖案名稱。然後它將執行爲它們中的每一個提供的命令,用文件名替換花括號。

唯一棘手的部分是分號,因爲這是關閉命令,但它必須受到保護而不受bash影響,因此也是反斜槓。

有關更多選項,請參見https://linux.die.net/man/1/find

+1

如果在'。/'中有備份文件,這將不起作用,因爲你也必須保護'*〜'免於bash。你也需要引用'*〜'。 –

0

首先,刪除這些文件是不能創建(或更確切地說,在一箇中心位置創建它們)的最佳方法:https://stackoverflow.com/a/151946/245173

下面是使用find從Emacs的收集方式文件列表並選擇性地對它們執行操作。 M-x find-name-dired RET /path/to/files RET *~ RET應該獲得/path/to/files/下的所有備份文件,並將它們放在直接緩衝區中。然後你可以用標準文件m做正常的事情,用t反轉選擇,然後用D刪除選擇。

相關問題