按月对文件进行分组并在 bash 中存档

按月对文件进行分组并在 bash 中存档

我的目录中有一堆在不同月份创建的文件。我想过滤掉在特定月份创建的文件并使用 tar 功能存档这些文件。到目前为止我尝试过的代码是

months="Dec-2021"
decfiles=find . -newermt "01-$months -1 sec" -and -not -newermt "01-$months +1 month-1 sec | tar cz decemberfiles.tar.gz"
echo $decfiles
          

上面的代码引发了我这样的错误

files.sh: 3: .: Illegal option -n
tar: Refusing to write archive contents to terminal (missing -f option?)
tar: Error is not recoverable: exiting now

我似乎无法弄清楚这一点,而且我也是 bash 的新手。任何帮助解决这个问题的帮助将不胜感激。

答案1

由于您是新手,我不会只是给您答案,我还会尝试解释如何开始解决此类问题。

首先,当您看到此类问题时,请尝试将它们分离并隔离为较小的命令。

例如,不要像您那样直接尝试将结果保存在文件中:

decfiles=find . -newermt "01-$months -1 sec" -and -not -newermt "01-$months +1 month-1 sec | tar cz decemberfiles.tar.gz"

只需尝试单独运行该find命令即可。

find . -newermt "01-$months -1 sec" -and -not -newermt "01-$months +1 month-1 sec | tar cz decemberfiles.tar.gz"

您很快就会看到:

错误#1

find: I cannot figure out how to interpret ‘01-Dec-2021 +1 month-1 sec | tar cz decemberfiles.tar.gz’ as a date or time

如果您真正阅读它,您会注意到您正在引号内运行管道:

"01-$months +1 month-1 sec | tar cz decemberfiles.tar.gz"

尝试#2

所以现在你应该希望找出 find 命令应该是:

find . -newermt "01-$months -1 sec" -and -not -newermt "01-$months +1 month-1 sec"

现在您将获得文件和目录的列表,这是一个开始。我建议你只打印文件,而不是目录,通过添加-type f.

find . -newermt "01-$months -1 sec" -and -not -newermt "01-$months +1 month-1 sec" -type f

所以现在我们要去某个地方。

接下来,我假设您想尝试类似的事情:

find . -newermt "01-$months -1 sec" -and -not -newermt "01-$months +1 month-1 sec" -type f |tar cz decemberfiles.tar.gz

这会抛出:

错误#2

tar: Refusing to write archive contents to terminal (missing -f option?)
tar: Error is not recoverable: exiting now

它表明您缺少-f选项,因此您查看 的手册页tar并看到您用来-f ARCHIVE提供存档的名称。您提供了文件名,但没有说这是存档。所以现在你尝试:

尝试#3

find . -newermt "01-$months -1 sec" -and -not -newermt "01-$months +1 month-1 sec" -type f |tar czf decemberfiles.tar.gz

错误#3

现在它会抛出新的错误:

tar: Cowardly refusing to create an empty archive
Try 'tar --help' or 'tar --usage' for more information.

为什么它说您正在尝试创建一个空存档?再次查看 的手册tar,您会发现您需要提供文件列表,如下所示论点

tar -c [-f ARCHIVE] [OPTIONS] [FILE...]

您尝试通过管道将文件提供给 tar 命令的 STDIN。所以它需要类似于:

tar czf decemberfiles.tar.gz <file1> <file2> <file3> ...

该命令正在生成您的文件列表find。如何向tar命令提供这些文件?有几个选项我不会解释,让你自己阅读。

选项1
tar czf decemberfiles.tar.gz $(find ./ -newermt "01-$months -1 sec" -and -not -newermt "01-$months +1 month-1 sec" -type f)
选项#2
tar czf decemberfiles.tar.gz `find ./ -newermt "01-$months -1 sec" -and -not -newermt "01-$months +1 month-1 sec" -type f`

提示:如果你想更好地理解它在做什么,可以尝试在命令前添加 echo 来看看它会是什么样子(我不会在这里写输出,让你自己找到它):

echo tar czf decemberfiles.tar.gz `find ./ -newermt "01-$months -1 sec" -and -not -newermt "01-$months +1 month-1 sec" -type f`
选项#3

最后一个选项,让您熟悉该xargs命令:

find ./ -newermt "01-$months -1 sec" -and -not -newermt "01-$months +1 month-1 sec" -type f |xargs tar czf decemberfiles.tar.gz

所以现在您至少应该拥有存档,所以这是一个开始。现在你应该发现你还有很多东西要学。

您仍然有一些问题需要克服,例如零件decfiles=...。再次尝试运行一个较小的命令并查看它的内容,并搜索如何将命令的输出分配给 bash 中的变量。我不会在这里解释它,因为你可以用谷歌搜索它,但希望现在你对如何开始学习 bash 并逐步克服障碍有一些更好的想法。

相关内容