我想從子文件夾中刪除所有emacs備份(〜)文件。 我知道我可以在每個文件夾中使用cd
,並使用rm *~
(例如備份文件test.cpp〜)將它們刪除。如何從終端遞歸刪除某些名稱的文件
如何用一個命令刪除這些文件,而無需在每個文件夾中進行cd'ing操作?
(我試過rm -r *~
和rm -rf *~
,但他們似乎並不管用)
我想從子文件夾中刪除所有emacs備份(〜)文件。 我知道我可以在每個文件夾中使用cd
,並使用rm *~
(例如備份文件test.cpp〜)將它們刪除。如何從終端遞歸刪除某些名稱的文件
如何用一個命令刪除這些文件,而無需在每個文件夾中進行cd'ing操作?
(我試過rm -r *~
和rm -rf *~
,但他們似乎並不管用)
你可以用find
和exec
來做到這一點。下面是一個你想要做的例子:
find -name '*~' -exec rm {} \;
讓我們來分解它是如何工作的。 find
命令將執行從其執行的目錄,默認情況下它將打印出它找到的所有內容。使用-name '*~'
告訴我們只選擇名稱與正則表達式*~
匹配的條目。我們必須引用它,否則shell可能會爲我們擴展它。使用-exec rm {}
將執行rm
找到的每件事情,並將{}
作爲文件名的佔位符。 (最後的;
需要告訴find
這是命令結束的地方,這不是什麼大不了的事情,但如果你不使用它,它會發出嗚嗚聲,什麼也不做,\
就是爲了逃避它,因爲;
是一個特殊的shell字符)
爲什麼'-exec rm {} \;'而不是'-delete'? –
簡短回答:這不會刪除目錄,也不需要'-type f'。較長的答案是使用'-delete'不能與'-prune'一起使用,因爲'-prune'意味着'-depth'。在這種情況下並不重要,但是使用'rm {}'可以使它在以後更具可擴展性。此外,如果您稍後選擇使用GNU Parallel,它也可以更好地工作。 –
@RandyMorris也afaik -delete是一個GNU(和BSD)擴展,它不在POSIX中,但我可能是錯誤的。 –
你會發現使用:
find ./ -name *~ -exec rm {} \;
此命令將遞歸列出所有文件,匹配給定的圖案名稱。然後它將執行爲它們中的每一個提供的命令,用文件名替換花括號。
唯一棘手的部分是分號,因爲這是關閉命令,但它必須受到保護而不受bash影響,因此也是反斜槓。
有關更多選項,請參見https://linux.die.net/man/1/find。
如果在'。/'中有備份文件,這將不起作用,因爲你也必須保護'*〜'免於bash。你也需要引用'*〜'。 –
首先,刪除這些文件是不能創建(或更確切地說,在一箇中心位置創建它們)的最佳方法: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
刪除選擇。
爲了記錄,使用'rm -f *〜'而不是'rm *〜'是個好主意,因爲如果沒有備份文件,'rm'會抱怨它找不到'*〜' 。使用'-f'會使它不會抱怨你並退出時出錯。 –