Command-Line

列出僅包含名為 Attic 的子文件夾的文件夾

  • August 3, 2016

在遷移到 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、 GNUfindcomm

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列印儲存庫中所有內容、文件和目錄的 basenames ( )。然後列印包含一個後代、文件或目錄的目錄。-printf '%h\n'``sort | uniq -u

然後第二個find列印目錄的basenames Attic。該集合與上述集合的交集(即comm -12)正是只有Attic後代的目錄。

這當然會愉快地忽略符號連結和其他有趣的東西,以及帶有嵌入換行符的文件名。無論如何,您不應該在 CVS 儲存庫中擁有這些。

引用自:https://unix.stackexchange.com/questions/299793