Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux-仅保存最近的10个文件夹并删除其余文件夹_Linux_Bash_Shell - Fatal编程技术网

Linux-仅保存最近的10个文件夹并删除其余文件夹

Linux-仅保存最近的10个文件夹并删除其余文件夹,linux,bash,shell,Linux,Bash,Shell,我有一个包含我的应用程序版本的文件夹,每次我上传一个新版本时,都会为其创建一个子文件夹,子文件夹名称是当前时间戳,下面是所用主文件夹的打印输出(ls-l | grep^d): 我正在寻找一个命令,它将保留最后10个版本(子文件夹)并删除其余版本 有什么想法吗?编辑: find . -maxdepth 1 -type d ! -name \\.| sort | tac | sed -e '1,10d' | xargs rm -rf 好了(已编辑) ls-dt*/| tail-n+11 | xar

我有一个包含我的应用程序版本的文件夹,每次我上传一个新版本时,都会为其创建一个子文件夹,子文件夹名称是当前时间戳,下面是所用主文件夹的打印输出(ls-l | grep^d):

我正在寻找一个命令,它将保留最后10个版本(子文件夹)并删除其余版本

有什么想法吗?

编辑:

find . -maxdepth 1 -type d ! -name \\.| sort | tac | sed -e '1,10d' | xargs rm -rf
好了(已编辑)

ls-dt*/| tail-n+11 | xargs-rm-rf


首先列出最近修改过的目录,然后将除前10个之外的所有目录发送到
rm-rf

您的目录名按时间顺序排序,这使操作变得简单。按时间顺序排列的目录列表只是
*
,或者更准确地说是
[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]
。因此,您希望删除除最后10个之外的所有对象

set [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/
while [ $# -gt 10 ]; do
  rm -rf "$1"
  shift
fi
(剩下的目录超过10个,请删除最旧的目录。)

说明:

  • 按时间顺序列出当前目录的所有内容(首先列出最近的文件)
  • 过滤掉所有目录
  • 忽略前10行/目录
  • 使用awk从剩余的“ls-l”输出中提取文件名

  • 删除这些文件

这假定这些是唯一的目录,而工作目录中不存在其他目录

  • ls-dt1
    通常只打印最新目录,而
    /*/
    将 仅匹配目录并打印其完整路径
    1
    确保一个 每匹配一行/列表
    t
    将时间排序为最新

  • sed
    将第11行向下移到底部,只打印这些行,然后将这些行传递到
    rm


您可以使用xargs,但对于测试,您可能希望删除
| rm-r
,以查看目录是否首先正确列出

如果目录名包含日期,则可以使用默认字母排序删除除最后10个目录外的所有目录

ls -d */ | head -n -10  | xargs rm -rf

我得到:rm:无法删除目录:`。'Whoa!首先,
ls-dt
仅输出
。第二,如果您将其更正为
ls-t
,您将删除10个最新的文件,这与要求的完全相反。第三,如果存在除所考虑的目录以外的文件,那么脚本将愉快地删除随机内容。第四,如果有“奇怪”的文件名,你的脚本可以做任何事情,因为你正在解析
ls
的输出,并且你正在将未准备好的输入传递给。等一下,我注意到你想保留前10个并删除所有其他文件名,我认为你需要删除前10个。嗯,你的错误很有意思。我想把最新的10.5秒修正。Grep和sed会变慢,
ls-d
会更快。(与其他解决方案相比)。而且
tail+10
也将删除第10条记录。因此,
tail+11
更好。我认为应该是:ls-l | grep^d | tac | sed-e'1,10d'| xargs rm-rf您正在解析
ls
的输出,并且您正在将未准备好的输入传递给。你的
grep^d
没有做你认为它在做的事情-如果你有
ls-l
,你需要提取文件名(这不是一个好主意),但是因为你没有,所以没有目录指示器。是的,那是垃圾。我的错。
ls -lt | grep ^d | sed -e '1,10d' |  awk '{sub(/.* /, ""); print }' | xargs rm -rf 
ls -dt1 /path/to/folder/*/ | sed '11,$p' | rm -r 
ls -d */ | head -n -10  | xargs rm -rf