在命令行中,我们如何以递归方式找出目录及其子目录中的所有zip文件,并仅保留最新修改的5个文件并删除剩余的文件。
文件路径如下所示:
答案 0 :(得分:0)
我有办法,但它涉及几个(简单)步骤。这可能是更优雅的方式,但这就是我如何知道。它们来自几个来源,我在答案的最后列出了这些来源。您将使用已安装的公用事业cd
,find
,ls
,rm
和head
。它将涉及创建和执行两个bash脚本。
cd ~/basedirectory
这将设置以下命令。请务必留在此目录中以获取其余命令。
find
pwd -name *.zip > find_zip
这将创建所有zip文件的列表,其中包含相对于您更改的目录的完整路径。它不是将它们打印到屏幕上,而是将它们写入您更改的目录中的find_zip文件。
cp find_zip remove_old_zip
这将创建第二个重复文件,稍后您将使用该文件删除旧文件。
在您喜欢的文本编辑器中打开find_zip文件。如果你不习惯使用任何,你可以使用gedit。如果您没有,请使用sudo apt-get udpate && sudo apt-get install gedit
执行以下搜索和替换(在gedit中):搜索\n
,并将其替换为" \\n"
这会将文件夹列表放在引号内。第一个反斜杠在每行的末尾放置一个“\”,这意味着继续读取下一行并一起执行所有代码。 \ n保留行结尾。最后一个“在每行的开头放一个引号。你需要引号来转义特殊字符,比如'和(可能在你的文件名中。
在文件顶部创建2个新行并输入:
ls -lt \
第一行将您的文件转换为bash脚本。第二行将列出您使用find
命令找到的所有文件,并按日期排序。
| head -5
。保存并退出文件。 |
是一个“管道”,它将获取ls
创建的有序文件列表的输出并将其提供给head
命令。 head
命令将仅列出最近修改的5个文件,并在屏幕上显示或打印它们。
作为步骤5-7的结果,您的文件应该如下所示:
basedirectory/2015/12/18/abc.zip
basedirectory/2015/12/18/def.zip
basedirectory/2015/12/18/ghi.zip
basedirectory/2015/12/18/jkl.zip
basedirectory/2015/12/08/mno.zip
basedirectory/2015/12/08/pqr.zip
basedirectory/2015/12/08/stu.zip
basedirectory/2015/12/07/stu.zip
到此:
#!/bin/bash
ls -lt \
basedirectory/2015/12/18/abc.zip \
basedirectory/2015/12/18/def.zip \
basedirectory/2015/12/18/ghi.zip \
basedirectory/2015/12/18/jkl.zip \
basedirectory/2015/12/08/mno.zip \
basedirectory/2015/12/08/pqr.zip \
basedirectory/2015/12/08/stu.zip \
basedirectory/2015/12/07/stu.zip \
| head -5
bash find_zip
。使用新发现的5个最新文件列表,打开在步骤3中创建的remove_old_zip文件。您还将此文件转换为bash脚本,但除了五个最新文件外,它将删除所有文件。
删除包含您要保留的5个文件的remove_old_zip
文件中的行。
执行以下搜索和替换(在gedit中):搜索\n
,并将其替换为" \\n"
这与步骤5相同。
在文件顶部创建2个新行并输入:
rm \
这与第6步类似,只是rm会删除仍然列出的文件。
删除remove_old_zip
文件最后一行的最终\。保存并退出。
输入bash remove_old_zip
。
输入rm find_zip remove_old_zip
。
这将删除两个脚本,这些脚本现在已被删除,因为文件已被删除。
来源: How can I list (ls) the 5 last modified files in a directory?
http://www.geekinterview.com/talk/758-how-to-continue-to-next-line.html
List files recursively in Linux CLI with path relative to the current directory