Command-Line
列出僅包含名為 Attic 的子文件夾的文件夾
在遷移到 git 之前,我正在清理 CVS 儲存庫。作為準備工作的一部分,我需要找到(並可能刪除)任何僅包含文件夾的
Attic
文件夾。我的 unix-fu 不強,但這是我嘗試過的,它不起作用,但希望能傳達意圖。
shopt -s globstar for file in **/* do if [ -d "$file" ];then if [`ls | wc -l` == 1 && `ls Attic | wc -l` == 1]; then ((echo Attic-only folder)) fi fi done
第二部分是然後找到任何空的文件夾(或文件夾鏈)。
例如,如果
/foo/bar/Attic
被刪除,並且/foo/bar
現在都是空的,我們也可以殺死樹的那部分。背景:我正在嘗試清理 CVS 儲存庫以遷移到 git。CVS 為已刪除的文件創建一個
Attic
文件夾。在過去的 10 年裡,發生了一些不好的事情。我完全了解風險和影響。我已經備份了我的數據,並且正在製作一份副本。
使用
bash
、 GNUfind
和comm
:comm -12 \ <( find /path/to/CVS/repo -printf '%h\n' \ sort | uniq -u ) \ <( find /path/to/CVS/repo -name Attic -type d -printf '%h\n' | \ sort )
第一個
find
列印儲存庫中所有內容、文件和目錄的basename
s ( )。然後列印包含一個後代、文件或目錄的目錄。-printf '%h\n'``sort | uniq -u
然後第二個
find
列印目錄的basename
sAttic
。該集合與上述集合的交集(即comm -12
)正是只有Attic
後代的目錄。這當然會愉快地忽略符號連結和其他有趣的東西,以及帶有嵌入換行符的文件名。無論如何,您不應該在 CVS 儲存庫中擁有這些。