删除除最新的4个目录以外的所有目录。

4
我想删除父目录中除最新的4个目录外的所有目录。您会如何在Bash中实现这一点?

你无法直接获取文件或目录的创建时间,因为它并没有被存储在任何地方。最接近的可能是inode的变更时间:http://www.faqs.org/faqs/unix-faq/faq/part3/section-1.html,并且添加或删除目录中的文件将会改变inode。 - Aaron Maenpaa
尽管从子目录中添加或删除文件不会更改父节点,但这并不影响。 - Aaron Maenpaa
4个回答

9
ls -atrd */ | head --lines=-4 | xargs rm -rf

编辑:将 'a' 参数添加到 ls 命令中


这将仅保留最近修改的4个目录,而不是最近创建的4个目录,不会注意以点开头的目录,对于包含换行符的名称,head将会断开,对于包含空格的名称,xargs也会断开,并且如果没有要删除的内容,则rm将打印错误消息。 - Alexey Feldgendler
好的观点。我现在已经将“a”添加到ls中以捕获带有点的目录,并使用grep来摆脱当前和父目录,但你是对的。正如你所指出的那样,这是一个简单的答案,但也有一些重要的限制。 - Leigh Caldwell
更正:不需要使用grep来过滤当前目录和父目录,因为它们不会被ls */显示。 - Leigh Caldwell

1
你可以这样做:
#!/bin/bash

#store the listing of current directory in var
mydir=`ls -t`
it=1

for file in $mydir
    do
        if [ $it -gt 5 ]
        then
            echo file $it will be deleted: $file
            #rm -rf $file
        fi
        it=$((it+1))
    done

(去掉rm前面的#才能真正执行;)


1
请澄清您是指“删除所有目录,但保留最新的四个”还是“删除除最新的四个目录之外的所有内容(文件和目录)”。
请注意,目录的创建时间是未知的。只能确定目录上次修改的时间,也就是添加、删除或重命名文件的时间。

0

另一种使用数组(为什么不呢?)的BSD安全方法

#!/bin/bash
ARRAY=( `ls -td */` )
ELEMENTS=${#ARRAY[@]}
COUNTER=4
while [ $COUNTER -lt $ELEMENTS ]; do
  echo ${ARRAY[${COUNTER}]}
  let COUNTER=COUNTER+1
done

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接